2016-03-31 4 views
2

Я работаю над проектом крепления футбольной лиги на консольном приложении C#. Я пытаюсь выбрать случайные команды из массива, который содержит команды, которые играют у себя дома и вдали. Когда я пытаюсь сгенерировать 9 случайных чисел, генерируется только 8 чисел, а 0 - нет, поэтому код не может разорвать цикл for. Я полагаю, что проблема заключается в том, что если оператор не позволяет генерировать значение по умолчанию такое же количество и Int массива элементов 0.C# Случайное число не генерируется 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

Также имейте в виду, что вы генерируете случайный экземпляр без семени.Чтобы обеспечить случайные результаты, вы должны использовать начальное значение в конструкторе. Random rand = new Random (Guid.NewGuid(). GetHashCode()); – CathalMF

+0

@CathalMF Почему высевают текущее время, не достаточно случайное? – Rawling

+0

@ Rawling Это, вероятно, есть. Я только что видел объект Guid на StackOverflow некоторое время назад и использовал его с тех пор. – 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

Ваша проблема инициализации по умолчанию ваших массивов:

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

Это создает массив, заполненный 0 с, потому что 0 значение по умолчанию для int.

Так что ваш if состояние

if (!randomHomeNumArray.Contains(randomHome)) 

всегда false для 0, потому что 0 уже содержится в массиве.


Вы можете инициализировать массивы вместо так:

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

В offshance 'Next' дважды возвращает один и тот же номер, он оставляет элементы в исходном порядке, слегка увеличивая вероятности этих родов. – Rawling

Смежные вопросы