-1

しばらくの間、質問をナビゲートし、たくさんのグーグル検索を行った後、「ランダム」ジェネレーターのどれも本当にランダムではないことに気づきました。ランダムとはどういう意味ですか? 完全なランダム性、それらをコンパイルして複数回実行した後に見つけたすべてのアルゴリズムは、結果が同じであるか、少なくともパターンが見つかるはずでした。これは非常にまずいです。私は MMO サーバー用の乱数ジェネレーターを作成しています。この機能は、アイテムのアップグレードから、一連のプレーヤーをチームに分割することまで、パターンは常に、常に悪いものです。プログラムを再起動するたびに、生成される数字の順序は同じです。私の考えでは、乱数を取得する最善の方法は時間をいじることです。何かが起こる正確な時間を知ることはできません。時間が非常に正確であればなおさらです。

inline __int64 NanoTime()
{
    struct { int low, high; } Nano;

    __asm push EAX
    __asm push EDX
    __asm __emit 0fh __asm __emit 031h
    __asm mov Nano.low, EAX
    __asm mov Nano.high, EDX
    __asm pop EDX
    __asm pop EAX

    return *(__int64 *)( &Nano );

}

static DWORD g_Prev = NanoTime();

__int64 xRandom( void )
{
    __int64 Now = NanoTime() - g_Prev / 2;
    CString strRand, strLast;
    strRand.Format( "%I64d", Now );
    strLast = strRand.GetAt( strRand.GetLength()-1 );
    strLast += strRand.GetAt( strRand.GetLength()-2 );
    return( atoi( strLast ) );
}

テキストは大きいですが、質問は簡単です。可能な限り最小のアルゴリズムを持つ実数ジェネレーターへの方向性が必要です。毎秒数十万回呼び出される私のソリューションは、私が探しているものではありません。ここだけです私が必要とする方向のヒントを与えるために。

boost最下位ビット順を使用しないなど、すでに調べましtime(0)たが、すべてパターンがあります。

4

1 に答える 1

5

それらをコンパイルして複数回実行した後に見つけたすべてのアルゴリズムは、結果が同じか、少なくともパターンが見つかるはずでした。

率直に言って、あなたが試したアルゴリズムはかなりお粗末だったか、アルゴリズムの使用方法や評価方法が最適ではなかったようです。

標準rand()が十分でない場合 (そしてそれは大きな問題です!)、最善の策はMersenne Twisterなどのより高度な疑似乱数ジェネレーターです。このようなアルゴリズムは、統計的ランダム性のさまざまなテストに合格することが実証されています。

使用するハードウェアを選択する必要がある場合、最近の (Ivy Bridge) Intel ハードウェアは、組み込みのエントロピー ソースを備えたオンチップ乱数ジェネレーターを提供します: RDRAND. これにより、適切なランダム性と高いスループットが得られますが、ニーズに対してはおそらくやり過ぎです。

プログラムを再起動するたびに、同じ順序の数字が生成されることを想像してみてください

それが問題である場合は、ジェネレーターを正しくシードしていないようです。実行ごとに 1 回実行し、現在の時間をシードとして使用すると、実行ごとに異なるランダム シーケンスが得られます。

私は素晴らしい解決策を思いつきました。

コードを正しく読んでいれば、エントロピー ソースはTSCmodulo100です。タイトなループでジェネレーターを呼び出してみて、実際のランダム性を確認してください。

于 2012-12-18T23:14:34.163 に答える