Aşağıdaki metod, alt değer, üst değer ve adet bilgileri girildiğinde istenilen aralıkta, istenilen sayıda ve benzersiz rasgele sayılar üretmeye yarıyor.
List<int> İkiSayiArasindaBenzersizRasgeleSayiUret
(int sayiAlt, int sayiUst, int sayiAdet = 1)
{
List<int> liste = new List<int>();
bool kontrol;
#region Kontrol Bölümü
if (sayiAlt == sayiUst)
{
MessageBox.Show("Alt ve üst değerler birbirine eşit.");
kontrol = false;
}
else if (sayiAlt > sayiUst)
{
MessageBox.Show("Üst değer, alt değerden küçük olamaz.");
kontrol = false;
}
else if (sayiAdet == 0)
{
MessageBox.Show("Sayı adedi sıfır olarak girilmiş.");
kontrol = false;
}
else if (sayiAdet > (sayiUst - sayiAlt) + 1)
{
MessageBox.Show(
sayiAlt.ToString() + " - " + sayiUst.ToString() + " " +
"Aralığında Üretilebilen En Fazla Sayı Adedi: " +
((sayiUst - sayiAlt) + 1).ToString() + "\n\n" +
"Girilen Adet Bilgisi: " + sayiAdet.ToString());
kontrol = false;
}
else
{
kontrol = true;
}
#endregion
#region Üretim Bölümü
if (kontrol == true)
{
while (liste.Count + 1 <= sayiAdet)
{
Random rasgeleSayi = new Random();
int uretilenRasgeleSayi = rasgeleSayi.Next(sayiAlt, sayiUst + 1);
if (!liste.Contains(uretilenRasgeleSayi))
{
liste.Add(uretilenRasgeleSayi);
}
}
}
#endregion
return liste;
}
//--------------------------------------------------
//İkiSayiArasindaBenzersizRasgeleSayiUret
//Metodumuz üç parametre alıyor ve bize
//List<int> tipinden bir değer döndürüyor.
//
//Metod temel olarak iki bölümden oluşuyor.
//Kontrol bölümü ve üretim bölümü.
//Eğer kontrol bölümünden bir sıkıntı çıkmazsa
//üretim bölümü çalışabilir hale geliyor ve
//rasgele sayı üretimi gerçekleştiriliyor.
//--------------------------------------------------
List<int> İkiSayiArasindaBenzersizRasgeleSayiUret
(int sayiAlt, int sayiUst, int sayiAdet = 1)
{
//--------------------------------------------------
//Rasgele sayıları List generic sınıfı üzerinden
//oluşturduğumuz bir örnekte saklayacağız.
//Rasgele sayılar da int tipinde olduğundan
//dolayı List generic sınıfının parametresini de
//int olarak girdik.
//--------------------------------------------------
List<int> liste = new List<int>();
//--------------------------------------------------
//kontrol isminde ve bool tipinde bir değişken
//tanımladık. Bu değişkeni metodun parametrelerini
//kontrol etmek için kullanacağız. Metod sadece
//bu kontrol değişkeni true değerini aldığı zaman
//çalışacak.
//--------------------------------------------------
bool kontrol = false;
//--------------------------------------------------
//Metodun ilk bölümü.
//Burada çeşitli kontroller yapılıyor ve
//eğer kontroller esnasında bir sıkıntı çıkmazsa
//yukarıda tanımlanmış olan kontrol isimli bool
//değişken true değerini alıyor.
//--------------------------------------------------
#region Kontrol Bölümü
//--------------------------------------------------
//Eğer kullanıcı iki parametreyi de eşit girmişse
//(sayiAdet parametresi de varsayılan olarak 1'e eşit)
//bu durumda üretilecek olan sayı bellidir.
//Bu da gereksiz bir durum.
//--------------------------------------------------
if (sayiAlt == sayiUst)
{
MessageBox.Show("Alt ve üst değerler birbirine eşit.");
kontrol = false;
}
//--------------------------------------------------
//Eğer alt değer üst değerden büyük girilmişse
//rasgele sayı üretmek için kullanacağımız ve
//ön tanımlı Next metodu hatalı çalışacak.
//Bu durumun olmasını istemiyoruz.
//
//Gerçi bunun da kontrolü yapılıp ona göre
//düzeltilebilir ama parametreleri doğru
//girmenin daha iyi olacağını düşünüyorum.
//--------------------------------------------------
else if (sayiAlt > sayiUst)
{
MessageBox.Show("Üst değer, alt değerden küçük olamaz.");
kontrol = false;
}
//--------------------------------------------------
//Eğer iki sayı aralığında hiç sayı üretilmeyecekse
//(başka bir deyişle 0 (yazıyla sıfır) adet sayı
//üretilecekse) bu metoda ne gerek var.
//--------------------------------------------------
else if (sayiAdet == 0)
{
MessageBox.Show("Sayı adedi sıfır olarak girilmiş.");
kontrol = false;
}
//--------------------------------------------------
//İki sayı arasında kaç adet sayı olduğunu
//terim sayısı formülüyle bulabiliriz:
//((son terim - ilk terim)/artış miktarı) + 1
//
//Şimdi bizim artış miktarı zaten 1, bu yüzden
//aşağıdaki hesaplamaya bunu dahil etmedim.
//
//Peki bu terim sayısı formülü ne işimize yarayacak?
//Eğer üretilmesi istenen sayı adedi, alt ve üst
//değer aralığındaki sayılardan fazlaysa bunu
//kullanıcıya bildirecek. (Hem de hiç utanmadan!)
//
//Örneğin 5 ve 10 arasında en fazla 6 adet sayı
//üretilebilirken (5, 6, 7, 8, 9, 10) adet
//parametresine 100 girildiğinde bu miktarı
//üretmek mümkün olmayacak.
//--------------------------------------------------
else if (sayiAdet > (sayiUst - sayiAlt) + 1)
{
MessageBox.Show(
sayiAlt.ToString() + " - " + sayiUst.ToString() + " " +
"Aralığında Üretilebilen En Fazla Sayı Adedi: " +
((sayiUst - sayiAlt) + 1).ToString() + "\n\n" +
"Girilen Adet Bilgisi: " + sayiAdet.ToString());
kontrol = false;
}
else
{
//--------------------------------------------------
//Eğer yukarıdaki kontrol işlemleri sonucunda bir
//sıkıntı çıkmamışsa kod çalışmaya devam edebilir
//demektir. O halde kontrol bool değişkenimizi
//true yaparak kodun ikinci bölümünü, yani
//üretim bölümünü, çalışabilir hale getirelim.
//--------------------------------------------------
kontrol = true;
}
#endregion
//--------------------------------------------------
//Benzersiz rasgele sayıların üretildiği bölüm.
//--------------------------------------------------
#region Üretim Bölümü
//--------------------------------------------------
//Eğer kontrol bool değişkeni true
//değerindeyse çalışmaya devam etsin.
//--------------------------------------------------
if (kontrol == true)
{
//--------------------------------------------------
//İstenilen sayıda rasgele sayı üretilene
//kadar aynı işlemleri yapmaya devam et.
//--------------------------------------------------
while (liste.Count + 1 <= sayiAdet)
{
//--------------------------------------------------
//Random sınıfından yardım alarak verilen sayı
//aralıklarında yeni bir rasgele sayı üretiyoruz.
//--------------------------------------------------
Random rasgeleSayi = new Random();
int uretilenRasgeleSayi = rasgeleSayi.Next(sayiAlt, sayiUst + 1);
//--------------------------------------------------
//Eğer üretilen yeni rasgele sayı liste
//(List<int> tipinde) değişkenimizde mevcut
//değilse bu yeni rasgele sayı liste değişkenine
//eklensin.
//--------------------------------------------------
if (!liste.Contains(uretilenRasgeleSayi))
{
liste.Add(uretilenRasgeleSayi);
}
}
}
#endregion
//--------------------------------------------------
//Yukarıdaki işlemler tamamlandığında bize
//List<int> tipinde bir rasgele sayılar
//listesi döndürecek.
//--------------------------------------------------
return liste;
}