我正在寻找一种方法来生成伪随机数序列,在任何平台上都能产生给定种子的相同序列结果。 我假设 rand()
/ srand()
不会保持一致(我可能对这个假设有错误)。
像Mersenne Twister (来自Boost.Random)这样的算法是确定性的。
Mersenne Twister
引擎和Normal
分布:new options available
#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <random>
int main()
{
std::random_device rd;
//
// Engines
//
std::mt19937 e2(rd());
//std::knuth_b e2(rd());
//std::default_random_engine e2(rd()) ;
//
// Distribtuions
//
std::normal_distribution<> dist(2, 2);
//std::student_t_distribution<> dist(5);
//std::poisson_distribution<> dist(2);
//std::extreme_value_distribution<> dist(0,2);
std::map<int, int> hist;
for (int n = 0; n < 10000; ++n) {
++hist[std::round(dist(e2))];
}
for (auto p : hist) {
std::cout << std::fixed << std::setprecision(1) << std::setw(2)
<< p.first << ' ' << std::string(p.second/200, '*') << '\n';
}
}
simplerandom
的库。它应该是跨平台的,我也打算针对多种语言进行目标设置。目前它支持 C 和 Python(两种语言生成相同的数字)。我计划很快在 C++ 中实现相同的生成器,遵循 Boost 和 C++11 随机 API。快速搜索参考资料得出:
使用相同种子的两个不同初始化,指示伪随机生成器在两种情况下对后续调用rand生成相同的结果序列。
但问题仍然存在。我假设上述规范仅适用于同一进程中的RNG。它很可能没有指定任何关于跨平台或跨编译器的事情。您最好的选择可能是找到一个可用于所有所需平台的库。然后,如果使用相同的值进行种植,它们应该返回相同的数字序列。
rand()
的行为,并不提供任何跨编译器或跨平台的保证。此外,使用内置PRNG会冒着各种不必要的风险。使用一个已知适合您需求的PRNG库。 - dmckee --- ex-moderator kitten
rand
的C实现。在我的测试中,当unsigned long
使用32(最小值)或64位时,它会给出完全相同的结果。 - Gabriel Devillers