我有以下代码:
unsigned int randomInt()
{
mt19937 mt_rand(time(0));
return mt_rand();
};
Run Code Online (Sandbox Code Playgroud)
如果我在for循环中调用此代码,例如4000次,我不会得到随机无符号整数,而是获得1000次一个值,然后接下来1000次获得下一个值.
我究竟做错了什么?
发生这种情况是因为你f在循环中调用了4000次,这可能需要不到一秒的时间,因此在每次调用时time(0)返回相同的值,因此使用相同的种子初始化伪随机生成器.正确的方法是一劳永逸地初始化种子,最好是通过a std::random_device,如下所示:
#include <random>
#include <iostream>
static std::random_device rd; // random device engine, usually based on /dev/random on UNIX-like systems
// initialize Mersennes' twister using rd to generate the seed
static std::mt19937 rng(rd());
int dice()
{
static std::uniform_int_distribution<int> uid(1,6); // random dice
return uid(rng); // use rng as a generator
}
int main()
{
for(int i = 0; i < 10; ++i)
std::cout << dice() << " ";
}
Run Code Online (Sandbox Code Playgroud)