2016-03-31 6 views
2

私はC#Consoleアプリケーションのサッカーリーグフィクスチャプロジェクトに取り組んでいます。 私は自宅で離れて遊んでいるチームを含むアレイからランダムなチームを選んでいます。 9つの乱数を生成しようとすると、8つの数字しか生成されず、0は生成されないので、コードはforループを解除できません。 私は問題はif文は、同じ番号を生成することはできませんし、int型の配列の要素のデフォルト値は、ここで0C#乱数が生成されない0

であるということであることは、コードと出力されているとします

C# Code Output

int randomHome; //Random number genetator for choosing a random iteration value from home array which containss the teams which plays at their home 
    int randomAway; //Random number genetator for choosing a random iteration value from awayarray which containss the teams which plays at away 

     Random randomNum = new Random(); 

     int[] randomHomeNumArray = new int[home.Length]; //array will hold the randomHome values and home array is the array which is holding the team's iteration values which plays at their home 
     int[] randomAwayNumArray = new int[away.Length]; //array will hold the randomAway values and away array is the array which is holding the team's iteration values which plays at away 
     for (int homeArrayCounter = 0; homeArrayCounter < randomHomeNumArray.Length; homeArrayCounter++) 
     { 
      randomHome = randomNum.Next(home.Length) 

      if (!randomHomeNumArray.Contains(randomHome)) 
      { 
       randomHomeNumArray[homeArrayCounter] = randomHome; //It will hold the randomHome values 
       Console.WriteLine(homeArrayCounter + ". iterasyon in Home " + randomHomeNumArray[homeArrayCounter]); 
      } 
      else 
      { 
       homeArrayCounter--; 
      } 
     } 
     Console.WriteLine("\n\n"); 


     for (int awayArrayCounter = 0; awayArrayCounter < randomAwayNumArray.Length; awayArrayCounter++) 
     { 
      randomAway = randomNum.Next(randomAwayNumArray.Length);  

      if (!randomAwayNumArray.Contains(randomAway)) 
      { 
       randomAwayNumArray[awayArrayCounter] = randomAway;  //It holds the random valures from away array which contains the teams which plays at away 
       Console.WriteLine(awayArrayCounter + ". iterasyon in Away " + randomAwayNumArray[awayArrayCounter]); 
      } 

      else 
      { 
       awayArrayCounter--; 
      } 
     } 
+0

また、シードなしでランダムインスタンスを生成していることにも注意してください。ランダムな結果を保証するには、コンストラクタでシード値を使用する必要があります。ランダムなrand =新しいランダム(Guid.NewGuid()。GetHashCode()); – CathalMF

+0

@CathalMFなぜ現在の時刻をランダムに入れないのですか? – Rawling

+0

@ Rawlingおそらくそうです。私はちょっと前にStackOverflowでGuidのことを見て以来、それを使ってきました。 – CathalMF

答えて

3

配列を初期化すると、デフォルトで各インデックスの値は0になります。乱数を使用しているときは、すでに存在するため、常に0にスキップします。

あなたはこのように試すことができます: - あなただけの配列をランダム化しようとしている表示されます

for(int i= 0; i<randomHomeNumArray.Length; i++){ 
      randomHomeNumArray[i] = -1; 
     } 

     for (int homeArrayCounter = 0; homeArrayCounter < randomHomeNumArray.Length; homeArrayCounter++) 
     { 
      do{ 
       randomHome = randomNum.Next(home.Length); 
      } while(!randomHomeNumArray.Contains(randomHome)); 
      randomHomeNumArray[homeArrayCounter] = randomHome; //It will hold the randomHome values 
      Console.WriteLine(homeArrayCounter + ". iterasyon in Home " + randomHomeNumArray[homeArrayCounter]); 
     } 
0

intはヌル可能なデータ型ではないため、デフォルトでint[]はゼロで初期化されます。たとえそれが空の配列だと思っても、実際にはすべての要素がゼロに設定された配列です。

問題を解決するには、int?[](ヌル可能なint配列)を使用することを検討してください。または、負の整数または最大の包括的な上限を超える整数を使用して配列を初期化できます。あなたが望むものをより良い方法で達成するには、@Enigmativityで提供されているソリューションを使用し、回答があればそれを受け入れてください。

1

あなたの問題は、あなたの配列のデフォルトの初期化です:0intのデフォルト値であるため、

int[] randomHomeNumArray = new int[home.Length]; 

これは、0秒でいっぱい配列を作成します。

だからあなたif条件

if (!randomHomeNumArray.Contains(randomHome)) 

は既に配列に含まれる00ためのために常にfalseです。


あなたは、代わりにこのようなあなたの配列を初期化する:

int[] randomHomeNumArray = Enumerable.Repeat(-1, home.Length).ToArray(); 

ですから、-1代わりの0とあなたif条件の作品でそれを埋めます。

2

代わりにこれを試してみてください。これだけです

Random randomNum = new Random(); 

int[] randomHomeNumArray = Enumerable.Range(0, home.Length).OrderBy(_ => randomNum.Next()).ToArray(); 
int[] randomAwayNumArray = Enumerable.Range(0, away.Length).OrderBy(_ => randomNum.Next()).ToArray(); 

を。完了しました。

+0

それはもっと簡単かもしれませんが、これは配列を適切にランダム化しない若干の可能性があります。 – Rawling

+0

@Rawling - どのようにそうですか?それは統一された並べ替えを実行します - 偏見はありません。 – Enigmativity

+0

Offchance On Nextは同じ番号を2回返しますが、元の順序で要素を残して、これらのソートの確率をわずかに上げます。 – Rawling