3

タイトルがすべてを物語っています。これ以上ライブラリを追加したくないので、できればスタンドアロンのものを探しています。

タイトな高性能ループで必要になるため、パフォーマンスは良好なはずです。それには、ランダム性の程度が犠牲になると思います。

4

2 に答える 2

11

特定の擬似乱数生成アルゴリズムは、このように動作します。問題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;
}
于 2013-03-19T13:24:34.250 に答える
8

メルセンヌ・ツイスターはこちら

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;
    }
}
于 2013-03-19T13:25:37.013 に答える