跨平台的一致的伪随机数

toa*_*tie 28 c c++ random

我正在寻找一种方法来生成伪随机数序列,这将为任何平台上的给定种子产生相同的序列结果.我假设rand()/ srand()不会保持一致(我对这个假设很容易出错).

rlb*_*ond 19

类似Mersenne Twister(来自Boost.Random)的东西是确定性的.

  • 请参阅我对C ++ 11随机生成器的问答。C ++ 11 mt19937在所有平台上都能提供一致的结果,但是标准发行版却不能,因此我创建了自己的发行版:http://stackoverflow.com/questions/34903356/c11-random-number-distributions-are-not一致的跨平台的一切 (2认同)

las*_*ock 8

Knuth已经发布了" 计算机编程艺术"第3.6节中描述的伪随机数生成器的公共域C(和FORTRAN)源代码.


Sha*_*our 6

我意识到这是一个旧线程,但现在使用C++ 11,有一大堆新选项可用.以下是页面中的一个提取示例,默认使用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';
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 即使使用相同的代码,在给定相同种子的情况下,C++ 11标准指定的分布也不是**,以产生可重现的结果.更不用说使用不同的库,比如libc ++ vs libstdc ++. (7认同)
  • 请参阅我对C ++ 11随机生成器的问答。C ++ 11 mt19937在所有平台上都能提供一致的结果,但是标准发行版却不能,因此我创建了自己的发行版:http://stackoverflow.com/questions/34903356/c11-random-number-distributions-are-not一致的跨平台的一切 (2认同)