100 個までの数値のセットがあります。このセットで MC シミュレーションを実行したいのですが、基本的な考え方は、セットを完全にランダム化し、最初の 20 個までの値で比較/チェックを行い、結果を保存して繰り返すことです。
現在、実際の比較/チェック アルゴリズムは非常に高速で、実際には約 50 CPU サイクルで完了します。これを念頭に置いて、これらのシミュレーションを最適化するために、ランダム セットをできるだけ速く生成する必要があります。
現在、George Marsaglia による Multiply With Carry アルゴリズムを使用しています。これは、非常に高速な 17 CPU サイクルでランダムな整数を提供します。ただし、Fisher-Yates のシャッフル アルゴリズムを使用すると、100 個のランダムな整数、約 1700 の CPU サイクルを生成する必要があります。これは、私の比較時間をはるかに覆い隠しています。
私の質問は、このタイプの MC シミュレーションを実行するための他のよく知られている/堅牢な手法はありますか?
セットから 20 個の値をランダムに選択することも考えましたが、20 個の一意のエントリが選択されるように衝突チェックを行う必要があります。
アップデート:
回答ありがとうございます。投稿後に思いついた方法について、別の質問があります。問題は、これが真に堅牢な (RNG が良好であると仮定して) ランダムな出力を提供するかどうかです。基本的に私の方法は、入力配列と同じ長さの整数値の配列を設定し、すべての値をゼロに設定することです。次に、次のように、入力セットから 20 個の値をランダムに選択し始めます。
int pcfast[100];
memset(pcfast,0,sizeof(int)*100);
int nchosen = 0;
while (nchosen<20)
{
int k = rand(100); //[0,100]
if ( pcfast[k] == 0 )
{
pcfast[k] = 1;
r[nchosen++] = s[k]; // r is the length 20 output, s the input set.
}
}
基本的には上で述べたように、20 個の値をランダムに選択しますが、衝突を回避するための多少最適化された方法のように思えます。これは良いランダム出力を提供しますか? その非常に高速です。