每次调用的新随机向量

时间:2015-10-06 15:38:18

标签: c++ random mersenne-twister

我想生成一个随机向量,包括[min,max]范围内的n个元素,这对于mersenne twister和我的代码可以正常工作。

显然,每次调用rand_vec函数时,都会得到相同的输出。但是每次调用它时我都需要随机函数来返回不同的结果。此外,整个过程需要播种,每次执行时输出必须相同。因此,使用std::random_device在我的函数中播种twister似乎不是一种选择。

此外,这个随机函数从我的程序的几个子程序中调用:

#include <iostream>
#include <vector>
#include <random>

std::vector<int> rand_vec(int n, int min, int max, std::mt19937 mt){

    std::vector<int> to_return(n);
    std::uniform_int_distribution<> my_dist(min, max);
    for(int i = 0; i < n; i++){
        to_return[i] = my_dist(mt);
    }
    return(to_return);
}

int main()
{
    std::vector<int> to_print(5);

    std::mt19937 mt;
    mt = std::mt19937(100);

    to_print = rand_vec(5, 0, 10, mt);
    for(int i = 0; i < 5; i++){
        std::cout << to_print[i] << " ";
    }

    std::cout << "\n\n";

    to_print = rand_vec(5, 0, 10, mt);
    for(int i = 0; i < 5; i++){
        std::cout << to_print[i] << " ";
    }

    std::cout << "\n\n";
}
  

使用/ EHsc / nologo / W4 main.cpp编译

     

编译成功!编译总时间:359 ms

     

1 0 10 8 3

     

1 0 10 8 3

     

总执行时间:562 ms

1 个答案:

答案 0 :(得分:5)

您需要通过引用传递随机数生成器

std::vector<int> rand_vec(int n, int min, int max, std::mt19937 mt)

应该是

std::vector<int> rand_vec(int n, int min, int max, std::mt19937 & mt)

否则,您将重复使用mt中相同的初始main(),该{{1}}将从同一位置开始,为您提供相同的序列。