标题说明了一切,我正在寻找最好是独立的东西,因为我不想添加更多库。
性能应该不错,因为我需要它在一个紧凑的高性能循环中。我想这将以随机性为代价。
标题说明了一切,我正在寻找最好是独立的东西,因为我不想添加更多库。
性能应该不错,因为我需要它在一个紧凑的高性能循环中。我想这将以随机性为代价。
任何特定的伪随机数生成算法都会表现得像这样。问题rand
在于它没有具体说明它是如何实现的。不同的实现将以不同的方式表现,甚至具有不同的质量。
但是,C++11 提供了新的<random>
标准库头文件,其中包含许多出色的随机数生成工具。其中定义的随机数引擎是明确定义的,并且给定相同的种子,将始终产生相同的数字集。
例如,流行的高质量随机数引擎是std::mt19937
,它是以特定方式配置的 Mersenne twister 算法。无论你在哪台机器上,以下总是会产生相同的 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;
}
这是梅森捻线机
您可以在这里找到 PRNG 的集合。
这是简单的经典 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;
}
}