我一直在阅读Boost c++文档,并试图找出如何生成0和1之间的随机实数,使用库的uniform_01
部分。有人有什么建议吗?
根据建议,我使用这段代码,但它每次生成相同的随机值。
double random01(mt19937 & generator)
{
uniform_01<mt19937> dist(generator);
return dist();
}
int main()
{
mt19937 generator(time(0));
for (int i = 0; i < 10; i++) {
cout << random01(generator) << endl;
}
return 0;
}
抱歉,如果我没有说清楚;这个问题解决不了,不管是我的答案还是其他人的答案。它每次仍然生成相同的随机值
这段代码中有几个'gotcha':
-
random01()
函数不引用生成器,而是获取生成器的副本。因此,如果您使用同一个生成器多次调用该函数-它将一次又一次地产生相同的值! -
random01()
中的static
uniform_01
仅在第一次调用random01时初始化,因此,如果使用不同的生成器调用它,它将不使用它,而是使用对第一个生成器的引用,甚至可能已被销毁,因为!
正确的是如下所示(注意参数列表中的&
,用于引用传递,并且缺少static
:
double random01(mt19937 & generator)
{
uniform_01<mt19937> dist(generator);
return dist();
}
这是我找到的解决方案:
#include <iostream>
#include <ctime>
#include <boost/random.hpp>
using std::cout;
using std::endl;
using boost::mt19937;
using boost::uniform_01;
double random01(mt19937 generator)
{
static uniform_01<mt19937> dist(generator);
return dist();
}
int main()
{
mt19937 generator(time(0));
cout << random01(generator) << endl;
}
代码从这里稍微修改;向博扬·尼科利奇致敬。
我把这个作为一个"解决方案",希望它能帮助别人,但请批评任何你注意到的错误。我试图将播种步骤与实际生成分开,这样龙卷风就不会在每次生成值时都播种。