C ++在循环中调用伪随机数生成器函数 - 常数种子问题

时间:2016-03-14 22:04:46

标签: c++ random mersenne-twister

我自己编程和学习C ++的新手。我设法编写了一个伪随机数生成器,它使用" Mersenne Twister"发动机。

double gen_rand()
{
 std::mt19937 generator (time(0));
 std::uniform_real_distribution<double> dis(0.0, 1.0);

 return dis(generator);
}

当我从main()内的循环调用此函数时,输出始终相同。我确定这是因为我在函数体time(0)中使用的种子。由于我每次拨打gen_rand()时都提供相同的种子,因此我得到相同的结果。

我能找到克服这个问题的一种方法是将函数体嵌入main()而不是使用单独的函数。但由于我可能在其他地方需要随机数,因此外部函数对我来说更有用。我看到有些人创建了标题来实现类似的结果,但这些解决方案远远超出了我目前的知识水平。

有没有办法在调用外部函数之前启动种子并让函数使用此过程生成随机数?

以下是我使用的循环:

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

int main()
{
 std::vector<double> r_num;

 for (int i = 0; i<leg; ++i)
 {
     r_num.push_back(gen_rand());
     std::cout << r_num[i] << std::endl;
 }
}

1 个答案:

答案 0 :(得分:2)

我正在使用它(与你的相似):

#include <random>
std::mt19937 rng(time(NULL));
int random(int n) {
  std::uniform_int_distribution<int> distribution(0, n);
  return distribution(rng);
}

正如您在此处所见:Uniformly random numbers ∈[min, max]

另外,正如提到的tobi303,您可以这样做:

#include <iostream>
#include <random>

std::mt19937 rng(time(NULL));
int n = 5;
std::uniform_int_distribution<int> distribution(0, n);

int main() {
        std::cout << distribution(rng) << std::endl;
        std::cout << distribution(rng) << std::endl;
        std::cout << distribution(rng) << std::endl;
        return 0;
}

多个输出:

gsamaras@gsamaras:~$ g++ -Wall -std=c++0x px.cpp 
gsamaras@gsamaras:~$ ./a.out 
3
1
0
gsamaras@gsamaras:~$ ./a.out 
5
2
0
gsamaras@gsamaras:~$ ./a.out 
5
2
1
gsamaras@gsamaras:~$ pico px.cpp
gsamaras@gsamaras:~$ g++ -Wall -std=c++0x px.cpp 
gsamaras@gsamaras:~$ ./a.out 
5
4
3