2016-09-17 17 views
-1

何が間違っているのか分かりません。"IndexOutOfRange exception"エラーを解決するには?

 static int WinningColumn() 
    { 
     Random rnd = new Random(46); 

     int[] winningnumbers = new int[6]; 
     int[] Check = new int[46]; 
     int i; 
     for (i = 0; i < winningnumbers.Length; i++) 
     { 
      winningnumbers[i] = rnd.Next(46); 
      Check[winningnumbers[i]]++; 

      if (Check[winningnumbers[i]] > 1) 
      { 
       i--; 
       continue; 
      } 

エラーはここに起こる:

 } 
     return winningnumbers[i]; 
     } 
+0

便利な投稿のヒント:(1)投稿を投稿する前に必ずここでエラーを検索してください。(2)あなたの投稿のどこにでもヘルプを追加しないでください。乞食の一形態として。 (3)「C#プログラムでIndexOutOfRange例外が発生する理由をトレースする方法」、(4)可能であれば問題を自分で調べ、デバッグしようとしたことを示すなど、有用なタイトルを使用してください。希望が役立ちます。 – halfer

答えて

1

forループを終了すると、インデクサ変数iの値が可能な最大インデックス(ループを壊す条件)よりも大きくなります。
変数iの値は6ですが、配列の受注番号の可能な最大インデックスは5です(0〜5は6つの整数要素です)。

あなたのコードは、このように書き直され、簡素化されなければならない、あなたの実際の

static List<int> WinningColumn() 
{ 
    // Do not initialize Random with a fixed value 
    // You will get always the same 'random' sequence 
    Random rnd = new Random(); 

    // Create a list to store the winners 
    List<int> winningnumbers = new List<int>(); 
    int i = 0; 
    while(i < 6) 
    { 
     int newNumber = rnd.Next(46); 
     if(!winningnumbers.Contains(newNumber)) 
     { 
      // If the list doesn't contain the number the add it and increment i 
      // Otherwise run the loop again.... 
      winningnumbers.Add(newNumber); 
      i++; 
     } 
    } 

    // This returns the whole list to the caller, 
    // you can use it as an array 
    return winningnumbers; 
} 

お知らせあなたの意図が何であるかは明らかではないが、あなたの目的は、0から45までの6つの当選番号を生成することであると仮定するとコードには、乱数ジェネレータの宣言にバグがあります。最初のシードを渡すので、このメソッドを呼び出すたびに、乱数ジェネレータは同じ番号のシーケンスで再び開始します。結果は同じ番号のリストになります。 Not very random to me
何も渡さないと、ジェネレータはシステム時間で初期化されるため、このメソッドを呼び出すたびに異なるはずです。

0

私はあなたがここに達成したいのか分かりません。

しかし、ループが、私は6 になったときですから、基本的にwinningnumbersにアクセスしようとしている終了しますwinningnumbers配列はそうあなたはあなたが5

まで0からのインデックスを使用することができます長さ6を持っているので、[6]が正しくありません

関連する問題