C/C++算法从不同平台上的相同种子生成相同的伪随机数序列?

问题描述:

标题说明了一切,我正在寻找一些最好是独立的东西,因为我不想添加更多的库。因为我需要它在紧张的高性能环路C/C++算法从不同平台上的相同种子生成相同的伪随机数序列?

性能应该不错。我想这是以随机程度为代价的。

+3

看一看C++ 11 [随机](http://en.cppreference.com/w/cpp/numeric/random)库。 – Antoine 2013-03-19 13:21:53

+0

可能DUP http://*.com/questions/922358/consistent-pseudo-random-numbers-across-platforms – 2013-03-19 13:22:25

+0

@Antoine - 将它产生在不同的实施方式中相同的序列? – dtech 2013-03-19 13:22:36

任何特定的伪随机数生成算法将这样的表现。 rand的问题在于没有说明它是如何实现的。不同的实现将以不同的方式表现,甚至具有不同的品质。

然而,C++ 11提供了新的<random>标准库头包含很多伟大的随机数生成设施。在内部定义的随机数引擎是明确定义的,并且在给定相同种子的情况下,将始终产生相同的一组数字。

例如,流行的高质量随机数引擎是std::mt19937,这是在一个特定的方式配置的梅森捻线机算法。无论哪台机器,你在,下面总是会产生相同的一组实数的0和1之间:

std::mt19937 engine(0); // Fixed seed of 0 
std::uniform_real_distribution<> dist; 
for (int i = 0; i < 100; i++) { 
    std::cout << dist(engine) << std::endl; 
} 
+0

谢谢,我们马上测试一下。 – dtech 2013-03-19 13:25:31

+1

修复你的代码std :: mt19337 std :: mt19937 – jonaprieto 2014-11-10 19:07:51

+2

这是真的吗?像mt19937这样的东西可以保证在所有平台上产生相同的结果吗? – 2016-01-20 11:11:56

这里有一个Mersenne Twister

这里is another another PRNG implementation in C

您可能会发现一个collection of PRNG here

这里的简约经典的PRNG:

#include <iostream> 
using namespace std; 

unsigned int PRNG() 
{ 
    // our initial starting seed is 5323 
    static unsigned int nSeed = 5323; 

    // Take the current seed and generate a new value from it 
    // Due to our use of large constants and overflow, it would be 
    // very hard for someone to predict what the next number is 
    // going to be from the previous one. 
    nSeed = (8253729 * nSeed + 2396403); 

    // Take the seed and return a value between 0 and 32767 
    return nSeed % 32767; 
} 

int main() 
{ 
    // Print 100 random numbers 
    for (int nCount=0; nCount < 100; ++nCount) 
    { 
     cout << PRNG() << "\t"; 

     // If we've printed 5 numbers, start a new column 
     if ((nCount+1) % 5 == 0) 
      cout << endl; 
    } 
}