Yazılım.
CevapSitesi.com Beta!
Çözüm Noktası
Facebook, Twitter, Google+ veya e-posta ile paylaşın.
| Sorular | Makaleler | Üyeler | Etiketler  | İletişim
Soru sormak ya da cevap vermek için;
giriş yapın veya üye olun.

Sosyal medya hesaplarınızla da giriş yapabilirsiniz.
0

Rastgele sayı üretmede hep aynı sonucu alıyorum

C# kodumda arka arkaya bir çok rastgele sayılar üretmem gerekiyor. Ancak rastgele sayı üreten fonksiyonumu her çağırdığımda aynı değeri alıyorum.

Kod şunun gibi bir şey:
class Program
{
	
	// Rastgele sayı üreten fonksiyon
	public static int RastgeleSayi(int alt, int ust) {
		Random r = new Random();
		return r.Next(alt, ust);
	}
	
    static void Main(string[] args)
    {
	for (int i=0; i<100; i++) {
		Console.WriteLine(RastgeleSayi(1, 1000));
	}
        Console.ReadKey();
    }
}

Soran:11.04.16 18:41
misafir  

2 Cevap

1
new Random()  ile yeni bir Random nesnesi oluşturmak her seferinde bilgisayarınızın saatine göre rastgele sayı oluşturma işlemini yeniden ayarlanıyor. Bundan sonra Next yöntemini çağırdığınızda aldığınız sonuç sonraki new Random()  ve Next ile alacağınız sonucun aynısı oluyor.

Bunun bir kaç çözümü var. En basitleri şunlar:

1. Tek bir Random nesnesi oluşturup, aynı nesne üzerinden Next yöntemini çağırın.
Örnek :
class Program
{

static void Main(string[] args)
{
Random r = new Random();
for (int i=0; i<100; i++) {
Console.WriteLine(r.Next(1, 1000));
}
Console.ReadKey();
}
}
2. Bu şekilde çağırmak istemezseniz ve illaki bir fonksiyon isterseniz şöyle bir şey yapabilirsiniz:
Örnek:
// Şöyle bir statik sınıf oluşturun.
public static class Cesitli
{
public static readonly Random r = new Random();
public static readonly Object kilitlemeNesnesi = new Object();
// Rastgele sayı üreten fonksiyon
public static int rastgeleSayi(int alt, int ust) {
lock(kilitlemeNesnesi) { return random.Next(min, max); }
}
}

// Kullanımı

class Program
{
static void Main(string[] args)
{
for (int i=0; i<100; i++) {
Console.WriteLine(Cesitli.rastgeleSayi(1, 1000));
}
Console.ReadKey();
}
}


Bu örnekteki lock, Random nesnesi statik tanımlandığından, aynı fonksiyon başka bir iş parçası (thread) tarafından çağırılabileceği için kullanılıyor. Bilmiyorsanız lock (kilit) işini ayrıca incelemelisiniz. Özellikle web sitesi gibi bir ortamda kullanıyorsanız bu gerekli.

Bunların haricinde şurada başka yollar da belirtilmiş.


Cevaplayan: 11.04.16 16:06
cevapsitesi
102,035p 16ü
Cevabı seçen: 08.06.16 00:02
canora
101,387p 4ü
0
class Program {
	static void Main(string[] args) {

		Console.Write("Kaç Adet Sayı Üretilsin= ");
		int adet = Convert.ToInt32(Console.ReadLine());
		Console.Write("Üretilecek Sayılar Kaçtan Başlasın= ");
		int baslangic = Convert.ToInt32(Console.ReadLine());

		Console.Write("Üretilecek Sayılar Kaçta Bitsin= ");
		int bitis = Convert.ToInt32(Console.ReadLine());

		Random sayi = new Random(); //Random Sınıfı Kullanılarak sayi nesnesi üretiyoruz. 
		List < int > sayilar = new List < int > (); //sayilar isminde integer değer alan liste üretiyoruz. 
		while (sayilar.Count != adet) //sayilar listesinin eleman sayısının; kullanıcı tarafından girilen adet
		// değişkenine eşit oluncaya kadar listeye sayı ekle diyoruz 
		{
			int uret = sayi.Next(baslangic, bitis); // uret değişkenine belirtilen sayı aralığında sayı ekle diyoruz.
			if (!sayilar.Contains(uret)) //uret değişkeninin önden listeyde olup olmadığını kontrol ediyoruz. 
			{
				sayilar.Add(uret); //yoksa ekliyoruz. 
			}
		}
		foreach(var say in sayilar) // sayıları liste içinde gezerek ekrana yazdırıyoruz. 
		{
			Console.Write(say + "-");
		}

	}
}


Cevaplayan: 11.07.19 07:37
chefoop
6p 2ü