異なる乱数の数を取得する方法 - シャッフルアルゴリズム

熟考に最初の質問:内部から乱数を選択する方法、要素が1から順に配置されているサイズ100、及び100の配列を有しますか?

最も簡単な方法は、システムを利用する方法である  Math.random() * 100 あなたが見つけるために、配列に対応する位置に、その後、0から99までの乱数を取得し、できるように、。

次は、問題を考える:  要素は内部50から乱数を選択する方法、1から100まで順番に配置されているサイズ100、の配列がありますか?

数が繰り返されないことに注意してください!

上記の考え方に基づいている場合、あなたの最初の考えはある:ランダム50回リストにありませんか?

しかし、そうすることは非常に明白なバグがあります:番号が繰り返されます。

それを変更しますか?

あったかどうかを確認するために、配列、各時間前の比較の乱数アウトを、取得します。

これは可能です!

しかし、小さな問題がまだある、極端なケースを考える:要素は1〜100の順に配置されているサイズ100のアレイは、内部から99の乱数を選択する方法があります

あなたは上記の方法に従った場合は、より後方に選択した番号がすでに配列が大きい場合には桁数の原因となります高い数字、の繰り返しの確率で選択されている、また、言葉の偉大な選択肢である、繰り返し回数の順になります素晴らしいです。

内部の配列の最初の要素ならば、この時、私たちは、思考の行を変更する必要が動揺が、それはできません選択の順序の前に50を押してください?

はい!

しかし、我々は混乱が何であるかに注意を払う必要がありますか?

54枚のカードとカードのパック、54!順列方法があります。あなたが行わいわゆる動揺操作を指し、にできるはずです生成に等しい確率の結果、これらの54!種類の一つ。

アルゴリズムをシャッフルして、これを行うことができます。

シャッフルアルゴリズム

フィッシャーイエーツシャッフルアルゴリズム1938年にロナルド・フィッシャーとフランクYates氏によって提案され、1964年にリチャードDurstenfeldのコンピュータプログラミングのバージョンに適用するようになって。

このアルゴリズムはよく理解が、非常に高速なハードウェアであり、人気のある説明である:前述の最後の番号の数N-1交換の任意の数の、その後のいずれかに最後から二番目の数N-2の数為替の数。

順列を生成するために等しい確率であることを証明することができます。
証明:
位置要素選択された要素は、乗法mが1 / N、すなわちに変えることができる選択された確率の* i番目の位置の確率P m個前のときはm = I-1、i番目の確率が選択されていないから選択されます
$$ \ FRAC {N-1} {N} * \ FRAC {N-2} {N-1} \ cdots \ FRAC {I} {I + 1} * \ FRAC {1} {I} = \ FRAC { 1} {N} $$
目に見えるものは何も私に関係ありません。
直感的な理解は、オーダーとは何の関係もに対応していないn個の個々の投票、要素の確率を得ることができ、誰もが等しくなっています。
 
 

おすすめ

転載: www.cnblogs.com/lfri/p/12195490.html