しばらくの間、質問をナビゲートし、たくさんのグーグル検索を行った後、「ランダム」ジェネレーターのどれも本当にランダムではないことに気づきました。ランダムとはどういう意味ですか? 完全なランダム性、それらをコンパイルして複数回実行した後に見つけたすべてのアルゴリズムは、結果が同じであるか、少なくともパターンが見つかるはずでした。これは非常にまずいです。私は 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)
たが、すべてパターンがあります。