我正在寻找一种方法来生成伪随机数序列,这将为任何平台上的给定种子产生相同的序列结果.我假设rand()/ srand()不会保持一致(我对这个假设很容易出错).
例如,如果我std::mt19937在GCC和MSVC下使用完全相同的种子和参数实例化a ,我应该得到相同的随机数序列吗?如果是这样的话,我认为这个属性通常适用于mersenne_twister_engine,因为mt19937只是一个具有特定参数的属性.这rand()在C中是不正确的.看起来标准文档是根据特定代码应用的转换,所以我怀疑它应该始终是相同的,但是魔鬼在细节中......
我想用C++ 11标准库中的随机数分布包含简单的函数,这些函数将分布的参数和生成器实例作为参数.例如:
double normal(double mean, double sd, std::mt19937_64& generator)
{
static std::normal_distribution<double> dist;
return dist(generator, std::normal_distribution<double>::param_type(mean, sd));
}
Run Code Online (Sandbox Code Playgroud)
我想避免分发对象中的任何隐藏状态,以便每个对此包装函数的调用仅取决于给定的参数.(可能每次调用此函数都可以使用不同的生成器实例.)理想情况下,我会使分发实例static const确保这一点; 但是,分布operator()不是const函数,所以这是不可能的.
我的问题是:为确保分发中没有隐藏状态,是否1)必要且2)足以reset()每次呼叫分配?例如:
double normal(double mean, double sd, std::mt19937_64& generator)
{
static std::normal_distribution<double> dist;
dist.reset();
return dist(generator, std::normal_distribution<double>::param_type(mean, sd));
}
Run Code Online (Sandbox Code Playgroud)
(总的来说,我reset()对随机分布函数的目的感到困惑......我理解为什么生成器有时需要重置/重新设置,但为什么分配对象需要重置?)
为什么标准发行版的结果不是强制要求在各实现之间保持一致?伪随机数生成器的结果是对经授权的是相同的另一方面.
例如,以下几乎肯定会为每个不同的标准库实现打印不同的东西.
std::mt19937 random {100};
std::normal_distribution<> dist;
std::cout << dist(random);
Run Code Online (Sandbox Code Playgroud)
假设我想进行程序生成,并希望相同的起始种子在平台和编译器之间产生相同的结果.我无法用stl做到这一点.我必须"回归"使用提升.为什么这不是缺陷?