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?..
public static int[] GetColumn() { 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; for (int i = 0; i < 10; ++i) { a = GetColumn(); foreach (int x in a) Console.Write("{0} ", x); Console.WriteLine(); } }
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();
}
}
CSD C ve Sistem Programcıları Derneği