İnsana hiçbir şey öğretemezsin, sadece kendi başına bilgi edinmesi için ona yardım edebilirsin.

Galileo Galilei

Böcek No: [2]
17 Ağustos 2009 C# - Genel

    Programcı sayısal lotoda rastgele bir kolon oynayan GetColumn isimli aşağıdaki metodu yazmış. Metot 6 elemanlı bir dizi referansıyla geri dönüyor. Daha sonra programcı bu metodu kullanarak 10 kolon oynamış. Aşağıdaki gibi bir çıktı elde etmiş:

 
Önce kodu inceleyin. Metotta algoritmik bir sorun yok, fakat başka bir sorun var. Sorunu bulabilecek misiniz?..

Satır Numaralarını Gizle

  1. public static int[] GetColumn()
  2. {
  3. int[] a = new int[6];
  4. System.Random r = new System.Random();
  5. bool flag;
  6. int val;
  7.  
  8. for (int i = 0; i < a.Length; ++i)
  9. {
  10. flag = false;
  11.  
  12. do
  13. {
  14. val = r.Next(1, 50);
  15. for (int k = 0; k < i; ++k)
  16. if (a[k] == a[i])
  17. {
  18. flag = true;
  19. break;
  20. }
  21. a[i] = val;
  22. } while (flag);
  23. }
  24.  
  25. return a;
  26. }
  27.  
  28. public static void Main()
  29. {
  30. int[] a;
  31.  
  32. for (int i = 0; i < 10; ++i)
  33. {
  34. a = GetColumn();
  35.  
  36. foreach (int x in a)
  37. Console.Write("{0} ", x);
  38. Console.WriteLine();
  39. }
  40. }

Yanıtı Göster

Random sınıfının varsayılan başlangıç metodu bilgisayardan zamanı alarak rastgele sayı üreticisine ilkdeğerini veriyor. Genellikle bu tür metotlar ve fonksiyonlar saniye duyarlılığı ile çalışır. Yani aynı saniye içerisinde bu metodu çağırırsanız rastgele sayı üreticisine aynı ilkdeğeri vermiş olursunuz; bu durumda o da hep aynı değerleri üretir. Metodun şöyle yazılması gerekirdi:

public static int[] GetColumn(System.Random r)
{
    int[] a = new int[6];
    bool flag;
    int val;

    for (int i = 0; i < a.Length; ++i)
    {
         flag = false;

         do
         {
             val = r.Next(1, 50);
             for (int k = 0; k < i; ++k)
                 if (a[k] == a[i])
                 {
                     flag = true;
                     break;
                  }
             a[i] = val;
         } while (flag);
     }

     return a;
}

public static void Main()
{
    int[] a;
    System.Random r = new System.Random();

     for (int i = 0; i < 10; ++i)
     {
         a = GetColumn(r);

         foreach (int x in a)
             Console.Write("{0} ", x);
         Console.WriteLine();
     }
}

Haftanın Böceği Yukarı