フィッシャー・イェーツのシャッフルアルゴリズム; Fisher-Yetes Shuffle
概要
配列をランダムにシャッフルする手順は以下のようになる。
Input: 要素数が\(N\)の配列(添字は\(0 \ldots N-1\)) Output:シャッフルされた配列
・\(i \)を\(N-1 \)から\(1\)へ減少させながら以下を行う。
\(0\)以上\(i\)以下のランダムな整数を\(j \)に代入する
配列の\(i, j \)番目を交換する
ソースコード
namespace ExRandom {
public static class RandomUtilitys {
public static void Shuffle<T>(MT19937 mt, T[] array) {
if(mt == null || array == null) {
throw new ArgumentNullException();
}
Discrete.DiceRandom rd;
for(int i = array.Length - 1, j; i >= 1; i--) {
rd = new Discrete.DiceRandom(mt, i + 1);
j = rd.Next();
T swap = array[j];
array[j] = array[i];
array[i] = swap;
}
}
}
}
関連項目
メルセンヌ・ツイスタ
各種確率分布サンプリング基本クラス
正確なN面サイコロ