为什么 boost 的随机数生成(在正态分布上)总是给出相同的值?
Why is boost's random number generation (on a normal distribution) always giving the same values?
我正在做一些随机数生成和得到可疑的行为。下面是我的代码:
// initialized earlier... in the constructor of a class
boost::mt19937 *rng = new boost::mt19937();
rng->seed(time(NULL));
// actual use here.
for (int i = 0; i < 10; ++i)
{
test();
}
void test()
{
boost::normal_distribution<> distribution(10, 10);
boost::variate_generator< boost::mt19937, boost::normal_distribution<> > resampler(*rng, distribution);
const double sample = (resampler)(); // always the same value.
}
我误用了boost中的随机抽样吗?我做错了什么,让它总是相同的值。我在构造函数中初始化随机数生成器,因此它应该总是吐出一个不同的值(不被重新初始化)
问题出在boost::variate_generator< boost::mt19937, boost::normal_distribution<> > resampler(*rng, distribution);
行。这个构造函数按值接受参数(参见文档)。因此,每个resampler
从生成器的一个相同副本开始,并调用它一次。
编辑:Shafik注意到同样的事情就在我做了一点之后。如果您确实不能将初始化提升到循环之外,您也可以重新播种生成器。根据您的应用程序,有许多方法可以实现这一点。下面只是一个例子:
void test()
{
static unsigned int seed = 0
rng->seed((++seed) + time(NULL));
boost::normal_distribution<> distribution(10, 10);
boost::variate_generator< boost::mt19937, boost::normal_distribution<> > resampler(*rng, distribution);
const double sample = (resampler)(); // always the same value.
}
注意:不要用time(NULL)
重新播种rng
,因为如果你在一个紧密的循环中调用test()
,可能会返回相同的值几次。
这是因为您正在实例化函数test
中的类,如果您将它们移到外面,则它按预期工作。您使用相同的生成器启动每个实例。请看这个最小的例子:
int main()
{
boost::mt19937 *rng2 = new boost::mt19937();
rng2->seed(time(NULL));
boost::normal_distribution<> distribution(0, 1);
boost::variate_generator< boost::mt19937, boost::normal_distribution<> > resampler(*rng2, distribution);
for (int i = 0; i < 10; ++i)
{
std::cout << resampler() << std::endl ;
}
}
如果你改变循环工作像你发布的代码,那么你会看到同样的问题:
for (int i = 0; i < 10; ++i)
{
boost::normal_distribution<> distribution(0, 1);
boost::variate_generator< boost::mt19937, boost::normal_distribution<> > resampler(*rng2, distribution);
std::cout << resampler() << std::endl ;
}
"为什么"已经在其他答案中解决了。下面是如何在不重新播种的情况下修复它(这破坏了使用生成器的意义):将normal_distribution
和variate_generator
与mt19937
一起初始化一次。
在你的类中,注意按适当的顺序定义这些成员。
作为旁注,'new'是没有用的,你可以简单地写:
boost::mt19937 rng ;
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- boost::进程间消息队列引发错误
- 整数不会重复超过随机数
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 如何通过Boost获得0.5增量的随机数
- 使用Boost分隔接口和随机数生成器类的实现
- 有关使用 boost 生成正常随机数的问题
- 使用boost::random跨平台生成一致的随机数
- 将boost用于长二重的(伪)随机数生成器
- 使用boost生成介于1和9999之间的随机数
- Boost库-不生成不同的随机数
- boost c++正在使用Mersenne Twister算法生成0到1之间的相同随机数
- 可以在运行时选择不同的Boost伪随机数生成器
- 二维数组和boost随机数生成器
- 为什么 boost 的随机数生成(在正态分布上)总是给出相同的值?
- c++ -11中使用boost封装的随机数生成器
- C++-Boost:获取相同的随机数.播种似乎不起作用
- 如何让Boost::random和Matlab产生相同的随机数
- 如何使用boost多精度生成正常的随机数