C/C++算法从不同平台上的相同种子生成相同的伪随机数序列?
标题说明了一切,我正在寻找一些最好是独立的东西,因为我不想添加更多的库。因为我需要它在紧张的高性能环路C/C++算法从不同平台上的相同种子生成相同的伪随机数序列?
性能应该不错。我想这是以随机程度为代价的。
任何特定的伪随机数生成算法将这样的表现。 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;
}
谢谢,我们马上测试一下。 – dtech 2013-03-19 13:25:31
修复你的代码std :: mt19337 std :: mt19937 – jonaprieto 2014-11-10 19:07:51
这是真的吗?像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;
}
}
看一看C++ 11 [随机](http://en.cppreference.com/w/cpp/numeric/random)库。 – Antoine 2013-03-19 13:21:53
可能DUP http://stackoverflow.com/questions/922358/consistent-pseudo-random-numbers-across-platforms – 2013-03-19 13:22:25
@Antoine - 将它产生在不同的实施方式中相同的序列? – dtech 2013-03-19 13:22:36