2016-03-31 39 views
2

C# Konsol Uygulaması üzerinde bir futbol ligi fikstürü üzerinde çalışıyorum. Evden ve uzakta oynayan takımları içeren diziden rastgele takımlar seçmeye çalışıyorum. 9 rasgele sayı oluşturmaya çalışırken, yalnızca 8 sayı üretiliyor ve 0 değil, bu nedenle kod for döngüsünü kıramaz.C# Rastgele sayı oluşturmuyor 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--; 
      } 
     } 
: Sorun eğer deyimi aynı sayıda ve int dizinin elemanları varsayılan değer Burada

0. kod ve çıkış olduğunu oluşturmak için izin vermediğini olduğunu varsayalım

+0

Ayrıca, Rastgele örneğini bir tohum olmadan oluşturduğunuzu da unutmayın.Rasgele sonuçlar elde etmek için kurucuda bir tohum değeri kullanmalısınız. Rastgele rand = yeni Rastgele (Guid.NewGuid(). GetHashCode()); – CathalMF

+0

@CathalMF Şu anki zamanın kesilmesi neden yeterince rasgele değil? – Rawling

+0

@Rawling Muhtemelen. Az önce StackOverflow'daki Guid olayını bir süre önce gördüm ve o zamandan beri kullanıyordum. – CathalMF

cevap

3

Bir diziyi hareketsizleştirdiğinizde, her dizin için varsayılan olarak 0 değerine sahiptir. Rastgele sayıyı kullandığınızda, zaten var olduğu için her zaman 0 atlar.

Böyle deneyebilirsiniz: - Size sadece diziler rastgele çalışıyoruz görünür

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 boş veri türü olmadığından, varsayılan olarak int[] sıfır ile başlatılır. Yani boş bir dizi olduğunu düşünüyorsanız bile, aslında tüm öğeler sıfır olarak ayarlanmış bir dizi.

Sorunu gidermek için, bunun yerine bir int?[] (null-int int array) kullanmayı düşünebilirsiniz. Ya da diziyi, bir negatif tamsayı veya maksimum dahil olan üst sınırdan büyük bir tamsayı ile başlatabilirsiniz. Daha da iyisi, daha iyi bir şekilde, daha iyi bir şekilde, @Enigmativity tarafından sağlanan çözümü kullanın ve eğer yardımcı olursa cevabını kabul edin. 0int için varsayılan değer olduğundan,

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

Bu 0 s ile dolu bir dizi oluşturur:

1

Senin sorunun Dizilerinize varsayılan başlatma olduğunu.

Yani if koşul

if (!randomHomeNumArray.Contains(randomHome)) 

zaten dizide bulunan 00 çünkü her zaman false olduğunu.


Böyle yerine diziler başlatılamıyor olabilir:

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

Yani -1 yerine 0 ve if durum çalışmaları ile doldurun.

2

.

yerine bu deneyin: bu kadar

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(); 

. Bitti.

+0

Daha basit olabilir, ancak bu diziyi düzgün bir şekilde rastgele bir şekilde kullanma şansı yoktur ... – Rawling

+0

@Rawling - Nasıl? Tek tip bir sıralama yapar - önyargı yoktur. – Enigmativity

+0

Next İleri off kapalı durumunda, aynı sayıyı iki kez döndürür, öğeleri orijinal sırasına bırakır ve bu tür olasılıkları biraz artırır. – Rawling