在我目前的C++ 11项目中,我需要执行M模拟.对于每个模拟m = 1, ..., M,我使用一个std::mt19937对象随机生成一个数据集,构造如下:
std::mt19937 generator(m);
DatasetFactory dsf(generator);
Run Code Online (Sandbox Code Playgroud)
根据/sf/answers/1085695971/和/sf/answers/1044704531/,Mersenne Twister PRNG受益于热身阶段,目前我的代码中没有.为方便起见,我提出了建议的代码片段:
#include <random>
std::mt19937 get_prng() {
std::uint_least32_t seed_data[std::mt19937::state_size];
std::random_device r;
std::generate_n(seed_data, std::mt19937::state_size, std::ref(r));
std::seed_seq q(std::begin(seed_data), std::end(seed_data));
return std::mt19937{q};
}
Run Code Online (Sandbox Code Playgroud)
在我的情况下的问题是我需要结果的可重复性,即在不同的执行中,对于每个模拟,数据集必须是相同的.这就是为什么在我目前的解决方案中,我使用当前的模拟种子Mersenne Twister PRNG.在我看来,使用std::random_device防止数据是相同的(AFAIK,这是确切的目的std::random_device).
编辑:通过不同的执行我的意思是重新启动可执行文件.
如何在不影响再现性的情况下在代码中引入上述预热阶段?谢谢.
这是基于@SteveJessop的第二个提案的暂定实现
#include <random>
std::mt19937 get_generator(unsigned int seed) {
std::minstd_rand0 lc_generator(seed);
std::uint_least32_t seed_data[std::mt19937::state_size];
std::generate_n(seed_data, std::mt19937::state_size, std::ref(lc_generator));
std::seed_seq q(std::begin(seed_data), std::end(seed_data));
return std::mt19937{q};
}
Run Code Online (Sandbox Code Playgroud)
这是基于@SteveJassop和@AndréNeve联合贡献的暂定实施.该sha256功能改编自/sf/answers/744290781/
#include <openssl/sha.h>
#include …Run Code Online (Sandbox Code Playgroud) 我几乎同时在两个线程上初始化两个随机数生成器,我希望两个生成器的行为完全不同.我会Random.nextInt(7)经常一个接一个地打电话给两台发电机.使用System.currentTimeMillis()不是一个好主意,因为看起来我的电脑速度太快,以至于从两台发电机获得的数字很可能是相同的.那么有没有办法配置,Random所以虽然它们被一个接一个地调用,但它们仍然表现不同?我希望该解决方案能够跨平台兼容,因此任何特定于平台的想法(例如读取)/dev/random都是不可接受的.感谢帮助.
我想生成两个不相关的正态分布随机数X 1,X 2的序列.
由于正态分布随机数来自统一数,我只需要两个不相关的统一序列.但是如何使用:
srand (time(NULL));
Run Code Online (Sandbox Code Playgroud)
我想我需要种子两次或做类似的事情?