コードの最初の大きな問題は、 の 2 つのインスタンスを作成していることですRandom
。のくだらないシードはnew Random()
、それらのインスタンスがまったく同じシーケンスを返す可能性が最も高いことを意味します。
new Random()
Environment.TickCount
数ミリ秒ごとにのみ変化するシードを使用します。したがって、 の 2 つのインスタンスをRandom
立て続けに作成すると、時間が同じになり、同じシーケンスが出力されます。
適切な解決策は、最初に のインスタンスを 1 つだけ作成Random
し、すべてのランダム性のニーズに対して if を使用することです。マルチスレッドには注意してください。 のインスタンスはRandom
スレッドセーフではありません。
また、 の上限random.Next
は排他的であるため、コードは 11 要素の配列でのみ機能することに注意してください。値をハードコーディングするのではなく、コレクションのサイズを使用することをお勧めします。
コードのもう 1 つの問題は、適切なスワップを実装していないことです。スワップするには、スワップに 2 つの問題があります。2 番目の方向に新しいインデックスを使用しており、ローカル変数に一時コピーを作成して、元の値ではなく上書きされた値を読み取らないようにする必要があります。
これらの問題を修正すると、コードは次のようになります。
Random random = new Random();//one persistent instance
public void shuffle()
{
for (int i = 0; i < 100000; i++)
{
var i1=random.Next(kaarten.Count);
var i2=random.Next(kaarten.Count);
var temp=kaarten[i1];
karten[i1]=kaarten[i2];
karten[i2]=temp;
}
}
とはいえ、100000 回反復するため、アプローチは少し非効率的です。標準的なシャッフル アルゴリズムは、Jon-Skeet がIs using Random and OrderBy a good shuffle algorithm?で説明している Fisher-Yates シャッフルです。.