【发布时间】:2022-01-26 22:33:27
【问题描述】:
我知道伪随机数生成器应该只用一个种子初始化一次。但是,在 C++ 中,随机数生成器和分布是分开的。
现在,分布函数对象应该创建一次吗?还是没关系?我的意思是,在从分布生成随机数时,将分布对象创建调用放在内部还是外部是否重要。或者这并不重要,因为分布函数只是将生成器映射到一个数字。
我问的原因是因为我使用生成器来生成从几个不同分布中提取的数字,最好将分布函数对象创建调用放在每个函数中并共享相同的随机数生成器。
int main()
{
boost::mt19937 rng(2);
//inside the function
rn_int_1(rng);
rn_int_1(rng);
boost::mt19937 rng2(2);
//outside the function
boost::random::uniform_int_distribution<> six(1,6);
rn_int_2(six,rng2);
rn_int_2(six,rng2);
exit(0);
}
void rn_int_1(boost::mt19937 & generator)
{
boost::random::uniform_int_distribution<> six(1,6);
cout<<six(generator)<<endl;
cout<<six(generator)<<endl;
cout<<six(generator)<<endl;
}
void rn_int_2(boost::random::uniform_int_distribution<> &six,boost::mt19937 & generator)
{
cout<<six(generator)<<endl;
cout<<six(generator)<<endl;
cout<<six(generator)<<endl;
}
结果是:
3
2
1
6
4
6
3
2
1
6
4
6
【问题讨论】:
-
"分布函数是否应该被调用一次":你的问题实际上是是否应该创建一个分布函数对象。
boost::random::uniform_int_distribution<> six(1,6);是变量定义,不是函数调用。对分布函数(对象)的调用发生在six(generator)。 -
@user17732522 谢谢!修改了我的问题。
-
顺便说一句,我刚刚注意到了。您使用 boost 而不是标准库是否有原因?不能用 C++11 或更高版本吗?
-
@user17732522 不完全是……这个问题是关于开销的……我更关心如果种子是固定的,它是否会生成相同的序列……