タイトルがすべてを物語っています。これ以上ライブラリを追加したくないので、できればスタンドアロンのものを探しています。
タイトな高性能ループで必要になるため、パフォーマンスは良好なはずです。それには、ランダム性の程度が犠牲になると思います。
タイトルがすべてを物語っています。これ以上ライブラリを追加したくないので、できればスタンドアロンのものを探しています。
タイトな高性能ループで必要になるため、パフォーマンスは良好なはずです。それには、ランダム性の程度が犠牲になると思います。
特定の擬似乱数生成アルゴリズムは、このように動作します。問題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;
}
メルセンヌ・ツイスターはこちら
C での別の PRNG 実装を次に示します。
ここで 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;
}
}