2016-03-30 6 views
-3

modern fisher yates shuffle algorithmのC#コードを作成しようとしましたが、thisを使用したいのですが、それはあまりにも複雑なので、以下のコードに簡略化しましたが、エラーがあります」[エラー] FATAL UNHANDLED例外:System.IndexOutOfRangeException:インデックスが配列の範囲外でした。私は何が間違っているのか分からない。この2行が問題となっているfisher-yatesシャッフルアルゴリズムの配列エラー

using System; 
class Program 
{ 
    static Random _random = new Random(); 
    static void Shuffle(int[] array) 
    { 
    int p = array.Length; 
    for (int n = p; n > 1 ; n--) 
    { 
     int r = _random.Next(1, n); 
     int t = array[r]; 
     array[r] = array[n]; 
     array[n] = t; 
    } 
    } 
    static void Main() 
    { 
     int[] array = { 1, 2, 3, 4, 5, 6, 7, 8 }; 
     Shuffle(array); 
     foreach (int value in array) 
     { 
     Console.WriteLine(value); 
     } 
    }  
} 
+0

'n'の初期値は 'array.Length'で、ループ内では' array [n] 'のインデックスを作成しています。それは例外です。 –

+0

C#の配列のインデックスはゼロです。したがって、エラーが消えるためにn = p-1から0にしてください。 –

答えて

0

int p = array.Length; for (int n = p; n > 1 ; n--)

を助けてください。配列は0でインデックス付けされているので、配列の長さから始めると、すでに境界外になっています。あなたは即座にpから1つを引いて修正することができます:int p = array.Length - 1;。配列のすべての要素に到達するには、nを0にする必要があります。n >= 0