このセクションでは、ランダムとは何か、そしてなぜそれを使用したいのかを概説します。
ランダムな範囲内にある大きなテーマについても言及し、関連するトピックにリンクする必要があります。ランダム化のためのドキュメンテーションは新しいので、それらの関連トピックの初期バージョンを作成する必要があります。
KnuthシャッフルとDurstenfeld-Fisher-Yatesシャッフルとしても知られています。このシャッフルはn
要素の配列を取り、それをシャッフルします。アルゴリズムは本当にランダムであり、シャッフルの後、配列の各順列は等しくなる可能性がある。
Javaの場合:
public static void shuffle(E[] deck) {
//From the end, swap each card with a random card from the unswapped portion.
for(int i = deck.length - 1; i > 0; i--)
{
//Pick an element from [0,i], inclusive.
int chosenCard = (int) (Math.random() * (i + 1));
E temp = deck[i];
deck[i] = deck[chosenCard];
deck[chosenCard] = temp;
}
}
注意:置換要素は[0、i]から来る必要があり、[0、i)排他ではありません。それ以外の場合、要素が所定の位置に残っている配列の置換は不可能です。
乱数が生成するためにO(1)を取ると仮定すると、アルゴリズムは定位置で動作し、O(n)時間と空間を要する。この方法でシャッフルされた配列は、要素ごとに償却されたO(1)の非繰り返し要素を取得するために使用できます。
E[] deck;
int drawIndex;
//Elements are taken from an index that advances.
public E drawUniqueCard()
{
//Once all cards have been drawn, reshuffle the deck and draw from the top.
if(drawIndex == deck.length)
{
shuffle(deck);
drawIndex = 0;
}
//Pull the next card off the deck.
return deck[drawIndex++];
}
ランダムなセットアップやインストールに関する詳しい手順。