2

リストのインデックスである 1 から 100 までの範囲の数値があり、ランダムにリストを選択する必要があります。リストで探しているものが見つからない場合は、リストに到達する範囲内で次のランダムな整数を選択する必要があり、それは以前に選択されたものであってはなりません,, これを行う方法がありますCで効率的に。インデックスの配列をシャッフルすることでそれを行うことができましたが、より良い方法があるかどうか知りたいです。

要約すると、ランダムであることがわかっていて、これまで使用されたことのない整数を返す、非常に優れたランダムアルゴリズムが必要です。

rand()、srand()、および randomize() については知っています。これらが目的に役立つかどうかはわかりません。

4

2 に答える 2

2

arc4random_uniformシステムで利用可能な場合は、トリックを実行します。

uint32_t r = 1U + arc4random_uniform(100); // r = 1...100

一意の番号が必要な場合は、値の配列から始めて、Fisher-Yates (別名 Knuth) shuffleを使用します。

配列が範囲よりも小さい場合は、一意の乱数で力ずくで埋めてからシャッフルできます。つまり、必要な数が 10 個だけの場合は、20 回の乱数生成呼び出しで生成できます。シャッフルが必要になるのは、このシナリオでのみ必要になることに注意してください (一致検索を高速化するため)。

もう 1 つの方法は、ベクトル [1...100] を設定し、そこから残りの要素をランダムに描画して、使用したエントリを削除することです。

于 2012-11-08T07:55:25.720 に答える
0

% 操作に関する知識srandを組み合わせることができます 。 % n - nの除算を思い出させてくれます。これは、n の場合は明らかに大きくなりません。 したがって、コードに関しては:randtime()

srand(time());
int value = rand() % n; // will give you random values within interval [0,n)

ただし、 rand() にはいくつかの欠点があることに言及する必要があります。そのうちの 1 つは、より低い値の確率が高くなるため、均一な分布を提供しないことです (stackoverflow でこのトピックに関連する議論を見つけることができます)。

于 2012-11-08T08:55:30.713 に答える