ランダム順列は、一連のオブジェクト、つまり順列値を持つランダム変数のランダムな順序です。ランダム順列の使用は、運任せのゲームや、符号理論、暗号化、シミュレーションのランダム化アルゴリズムでよく使用されます。ランダム順列の良い例は、標準的なトランプの公平なシャッフルです。これは、理想的には 52 枚のカードのランダム順列です。
ランダム順列の計算
エントリーごとの方法
大きさn の集合のランダム順列を一様ランダムに生成する、すなわちn個の順列のそれぞれが等しく出現する可能性があるようなアルゴリズムの1つは、 1からn (両端を含む)までの整数を一様ランダムに選択し、 n回連続して置換せずにシーケンスを生成し、このシーケンス(x 1、...、x n)を順列として 解釈することです。
ここでは2 行表記で示されています。
非効率的なブルートフォース方式による非置換サンプリングでは、各ステップで 1 からnまでの数字から選択し、ランダムに選択された数字がすでに選択された数字の繰り返しである場合は、まだ選択されていない数字が選択されるまで選択を再試行します。このような場合、ステップごとの予想される再試行回数は、すでに選択された数字の割合の逆数に比例し、全体の再試行回数はそれらの逆数の合計になるため、これは非効率的なアプローチになります。
このような再試行は、各i番目のステップでx 1、...、x i − 1 がすでに選択されている場合に、 1 からn − i + 1 (両端を含む)までの間で一様乱数j を選択し、 x i をまだ選択されていない数の中でj番目に大きい数に設定するアルゴリズムを使用することで回避できます。これにより、再試行なしで、各ステップで残りの数の中から一様ランダムに選択されます。
フィッシャー・イェーツのシャッフル
フィッシャー・イェイツ・シャッフルと呼ばれる、再試行なしでn 個のアイテムの順列を一様にランダムに生成する簡単なアルゴリズムは、任意の順列(たとえば、恒等順列)から始めて、位置 0 からn − 2までを調べ(最初の要素のインデックスは 0、最後の要素のインデックスはn − 1 という規則を使用します)、各位置iで、現在そこにある要素を、位置iからn − 1(末尾)までの中からランダムに選択された要素と交換します。このアルゴリズムでは、 n個の要素の任意の順列が正確に 1/ n !の確率で生成され、順列が一様に分布します。
unsigned universe ( unsigned m ); /* 一様分布の 0 <= universe(m) <= m-1 のランダムな整数を返します */
void initialize_and_permute ( unsigned permutation [], unsigned n ) { unsigned i ; for ( i = 0 ; i <= n -2 ; i ++ ) { unsigned j = i + universe ( n - i ); /* i ≤ j < n となるランダムな整数 */ swap ( permutation [ i ], permutation [ j ]); /* ランダムに選択された要素を permutation[i] と交換します */ } }
uniform()関数が単純に として実装されている場合random() % (m)、 の戻り値の数が m の倍数でない場合は、順列の分布に偏りが生じます。ただし、 の戻り値の数がm よりも桁違いに大きい
random()場合、この影響は小さくなります。random()
ランダム性テスト
ランダム プロセスのすべての計算実装と同様に、Fisher-Yates シャッフルなどのランダム化アルゴリズムの実装によって生成される分布の品質、つまり実際に生成される分布が目的の分布にどれだけ近いかは、疑似乱数ジェネレータやハードウェア乱数ジェネレータなどの実装におけるランダム性の基盤となるソースの品質に依存します。ランダム順列のランダム性テストは多数あり、たとえばDiehard テストの「重複順列」テストなどがあります。このようなテストの一般的な形式は、分布が理論的にわかっている順列統計を取得し、実装からランダムに生成された順列のセットでのその統計の分布が、真の分布からのその統計の分布に近似するかどうかをテストすることです。
ランダム順列の統計
固定点
n個の要素からなる均一に分布するランダム順列の固定点の数の確率分布は、 nが増加するにつれて、期待値1のポアソン分布に近づきます。 [1]この分布の最初のnモーメントは、ポアソン分布のモーメントとまったく同じです。特に、ランダム順列に固定点がない確率 (つまり、順列が乱れている確率) は、 nが増加するにつれて1/ eに近づきます。
参照
- エウェンスの標本抽出法—集団遺伝学との関連
- ファロシャッフル
- ゴロム・ディックマン定数
- ランダム順列統計
- シャッフルアルゴリズム- ランダムソート法、反復交換法
- 擬似ランダム順列
参考文献
- ^ Durstenfeld, Richard (1964-07-01). 「アルゴリズム 235: ランダム順列」Communications of the ACM . 7 (7): 420. doi : 10.1145/364520.364540 .
外部リンク
- MathWorldでのランダム順列
- ランダム順列生成 - 擬似コードによる、 k順列(リストから選択されたk要素の順列)とk部分集合(リスト内の要素のサブセットを置換なしで生成)を生成するためのKnuthシャッフルアルゴリズムとその変種の詳細で実用的な説明
