0

重複の可能性:
Fisher-Yates shuffle のこの C 実装は正しいですか?

アプリケーションへの入力シーケンスの異なる順序をシミュレートするために、配列入力のランダム化シーケンスのリストを生成したいと思います。たとえば、arr[10] の場合、デフォルトのシーケンスは 0,1,..,8,9 です。ただし、シーケンスをランダムな順序、たとえば 2,4,5,1,9,0,3,7,8,6 に操作したいと思います。

rand() は 0 ~ 9 のランダムな値を生成すると思いますが、各要素が少なくとも 1 回は生成されるとは限りません。そのような場合、以下の疑似を考えていますが、ランダムな入力シーケンスを生成し、指定された範囲内の各数値が少なくとも 1 回生成されるようにするより良い方法はありますか?

round #1:  
  generate a random number within 0-9.  
    let say 2 is selected  

round #2:  
    generate a random number within 0-1  
    generate a random number within 3-9  
    let say 0 and 4 are selected  

round #3:  
    generate a random number within 1  
    generate a random number within 3  
    generate a random number within 5-9  
    let say 1, 3, 7 are selected  

round #4:  
    generate a random number within 5-6  
    generate a random number within 8-9  

continue until 10 numbers are selected
4

2 に答える 2

2

要件については、こちらのFisher-Yates シャッフル アルゴリズムを参照してください。

于 2012-07-13T07:35:16.957 に答える
1

別のアプローチを次に示します。

  1. 10 要素の配列を作成し、ランダム化する値 (0、1、...、9) を入力します。
  2. k を 9 から 0 まで反復し、乱数インデックス = rand(k) を選択します。
  3. 位置 k の要素を位置 index の要素と交換します。

最後に、配列には元の値のランダムな順列が含まれます。これはまさにあなたが望んでいたものです。

于 2012-07-13T07:34:32.547 に答える