如何避免相同的随机数序列
How to avoid same sequences of random numbers
我想生成不同序列的均匀分布样本。为此,我用不同的种子初始化了默认的随机引擎,但产生了相同的序列:
#include <iostream>
#include <random>
void fun(double seed)
{
std::cout << "given seed: " << seed << std::endl;
std::default_random_engine gen_2(seed);
std::uniform_real_distribution<double> dis_2(0.0,1.0);
std::cout << dis_2(gen_2) << std::endl;
std::cout << dis_2(gen_2) << std::endl;
}
int main()
{
double seed = 1.0;
std::default_random_engine gen_1(seed);
std::uniform_real_distribution<double> dis_1(0.0,1.0);
for(size_t i=0; i<3; ++i)
{
fun(dis_1(gen_1));
}
}
输出为:
给定种子:0.0850324
0.0850324
0.891611
给定种子:0.891611
0.0850324
0.891611
给定种子:0.18969
0.0850324
0.891611
如何在函数中生成不同的序列 fun
?
生成器的种子是一个整数。
问题是你的dis_1
生成的所有数字都小于1,大于或等于0。因此当转换为整数时,它们隐式转换为相同的值0。
解决方案是使用不同的种子,而不是始终使用 0。
我想生成不同序列的均匀分布样本。为此,我用不同的种子初始化了默认的随机引擎,但产生了相同的序列:
#include <iostream>
#include <random>
void fun(double seed)
{
std::cout << "given seed: " << seed << std::endl;
std::default_random_engine gen_2(seed);
std::uniform_real_distribution<double> dis_2(0.0,1.0);
std::cout << dis_2(gen_2) << std::endl;
std::cout << dis_2(gen_2) << std::endl;
}
int main()
{
double seed = 1.0;
std::default_random_engine gen_1(seed);
std::uniform_real_distribution<double> dis_1(0.0,1.0);
for(size_t i=0; i<3; ++i)
{
fun(dis_1(gen_1));
}
}
输出为:
给定种子:0.0850324
0.0850324
0.891611
给定种子:0.891611
0.0850324
0.891611
给定种子:0.18969
0.0850324
0.891611
如何在函数中生成不同的序列 fun
?
生成器的种子是一个整数。
问题是你的dis_1
生成的所有数字都小于1,大于或等于0。因此当转换为整数时,它们隐式转换为相同的值0。
解决方案是使用不同的种子,而不是始终使用 0。