我有下面这段代码:
unsigned int randomInt()
{
mt19937 mt_rand(time(0));
return mt_rand();
};如果我调用这段代码,比如在for循环中调用4000次,我不会得到随机的无符号整数,相反,我会得到1000次一个值,接下来1000次我会得到下一个值。
我做错了什么?
发布于 2015-04-10 06:43:12
这是因为您在一个循环中调用f 4000次,所需时间可能不到1毫秒,因此每次调用time(0)都返回相同的值,因此使用相同的种子初始化伪随机生成器。正确的方法是一次性初始化种子,最好是通过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() << " ";
}发布于 2015-04-10 06:18:07
随机性的来源是属于整个程序的资源,而不是属于单个函数的资源。您不应该在用于返回随机值的例程中创建随机性来源。
好的选项包括:
你可能认为不应该尝试做的一件事是用一个分辨率更高的类似函数替换time(0);虽然你会得到不同的结果,但这仍然会生成质量很差的随机数,甚至可能比正确生成随机数慢得多。(我相信有一些随机数生成器可以在这种用法下正常工作,但它们必须为此目的而设计)
https://stackoverflow.com/questions/29549873
复制相似问题