我一直在阅读Boost C ++文档,并试图找出如何使用库的uniform_01
部分生成0到1之间的随机实数。有没有人有任何建议?
根据建议,我正在使用此代码,但每次都会生成相同的随机值。
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;
}
抱歉,如果我不清楚;我的回答或任何其他问题都没有解决这个问题。它每次仍然生成相同的随机值。
答案 0 :(得分:2)
此代码中有一些问题:
random01()
函数不引用生成器,而是引用生成器的 copy 。因此,如果您使用相同的生成器多次调用该函数 - 它将反复生成相同的值!static
中的uniform_01
random01()
仅在第一次调用random01时被初始化,因此如果使用不同的生成器调用它,则不会使用它,而是使用它自第一个生成器的引用,甚至可能已被销毁!正确就像是跟随(请注意参数列表中的&
,传递引用,以及缺少static
:
double random01(mt19937 & generator)
{
uniform_01<mt19937> dist(generator);
return dist();
}
答案 1 :(得分:0)
这是我找到的解决方案:
#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;
}
代码略有修改here;帽子提示Bojan Nikolic。
我将此作为“解决方案”发布,希望它可以帮助某人,但请批评任何您发现错误的内容。我尝试将播种步骤与实际生成分开,因此每次生成一个值时都不会播种。