我正在寻找一种生成伪随机数序列的方法,该序列将在任何平台上为给定种子产生相同的序列结果。我假设rand()
/ srand()
不一致(我对此假设很容易出错)。
答案 0 :(得分:19)
像Mersenne Twister (from Boost.Random)这样的东西是确定性的。
答案 1 :(得分:8)
Knuth对于计算机编程艺术的第3.6节中描述的伪随机数生成器有released into the public domain C (and FORTRAN) source code。
答案 2 :(得分:6)
我意识到这是一个旧线程,但现在使用C ++ 11,有一大堆new options available。以下是页面中的一个提取示例,默认使用Mersenne Twister
引擎和Normal
分发:
#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';
}
}
答案 3 :(得分:1)
我一直在为simplerandom
库工作。它应该是跨平台的,我的目标也是针对多种语言。目前它支持C和Python(在两种语言中生成相同的数字)。我计划很快使用Boost和C ++ 11随机API在C ++中实现相同的生成器。
答案 4 :(得分:0)
最简单的方法是自己编写一个随机数生成器,但使用为不同平台发布的库并保证提供相同的结果也可以。
我怀疑rand()/ srand()是否一致,但我不知道。
答案 5 :(得分:0)
快速用Google搜索reference说:
使用相同种子进行两次不同的初始化,指示伪随机生成器为后续调用rand生成相同的连续结果。
但问题仍然存在。我假设上述规范仅适用于同一过程中的RNG。它很可能没有指定任何有关跨平台或交叉编译器的东西。您最好的选择可能是找到适用于所有所需平台的库。那么你应该相当安全,如果以相同的值播种,它们将返回相同的数字序列。