Soru & Cevap

C'de kendi rastgele fonksiyonunu oluşturma. ...

19.04.2020 - 11:05

Merhaba.

C'de hazır fonksiyon/sınıf kullanmadan (random gibi) rastgele sayı üretme işlemini nasıl yapabilirim? Java'da yaptığımda zamana bağlı olarak çalışan bu işlem, C'de hep aynı sayıyı üretiyor. Bunu nasıl engelleyebilirim?

6 Görüntülenme

2 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

picture-279119-1587461397.jpg
dhdemirpolat
21.04.2020 - 01:26

Shift register, flip flop devrelerinin cascade bağlandığı bir yapıdır. LFSR ile random sayılar üretilebilir.
https://en.wikipedia.org/wiki/Linear-feedback_shift_register
Aşağıda lfsr devresinin basit bir C versiyonu vardır. buradan basitçe rastgele sayı üretilebilir.
 

unsigned short lfsr = 0xACE1u;
unsigned bit;
 
unsigned rand()
{
   bit  = ((lfsr >> 0) ^ (lfsr >> 2) ^ (lfsr >> 3) ^ (lfsr >> 5) ) & 1;
   return lfsr =  (lfsr >> 1) | (bit << 15);
}

 

Profile picture for user tugbagci
tugbagci
20.04.2020 - 09:17
İkinci sorunu yaşıyorum. Cevabınız için çok teşekkür ederim ama ödevde sleep fonksiyonu kullanmamamız isteniyor maalesef.
Stl
21.04.2020 - 04:40
O zaman son olarak şu şekilde bir yol izleyebilirsiniz: Sonuçta ikinci sorunu yaşadığınıza göre halihazırda bir döngü kullanıyorsunuz demektir. Döngünüzde de bir iterasyon değişkeni olduğunu varsayıyorum. Yoksa bile kolay bir şekilde, artan bir iterasyon değişkeni ekleyebilirsiniz. İçinde 1, 2 ve 3 elemanları bulunan üç elemanlı bir dizi tanımlayın (isterseniz daha fazla elemanlı veya daha dinamik bir yapı da oluşturabilirsiniz). Daha sonra döngüde bulunan iterasyon değişkenini, döngü içerisine yazılacak if blokları içerisinde mod işlemine tabi tutun ve eğer tam bölünüyorsa bitwise operatörleri yardımıyla, iterasyon değişkenini tam bölen dizi elemanı kadar kaydırın. Yani örneğin, iterasyon değişkeni i=3 diyelim, 3 değeri 3,6,9… döngü sayısını/sayılarını tam böldüğü için sağa veya sola (>> ya da << operatörleriyle) 3 sayısı kadar kaydırarak bambaşka bir sayı üretebilirsiniz. Bu durumda bu üç if bloğundan biri her seferinde çalışacak ve bu sayede farklı bir rastgele sayı üretilmiş olacak. Fakat program yine de hızlı çalıştığı için 3-4 defa üretilecek rastgele sayılardan sonra bir örüntü gibi yine aynı sayılar devam edecek (örneğin 3,6,12,64,3,6,12,64… gibi). Bu sefer de dizi elemanlarını artırarak (yani 1,2 ve 3 elemanları yerine 1'den 9'a kadar olan sayıları kullanabilirsiniz) ya da <<, >> ve >>> olmak üzere bu 3 adet bitwise operatörünü daha faydalı bir şekilde kullanarak oluşturulan sayılarda bit düzeyinde kaydırma yaparak sorunu çözebilirsiniz. Diyelim ki 9 adet dizi elemanını kullandık ve sırasıyla <<, >> ve >>> operatörleriyle kaydırma yapacağız. Bu durumda ilk iki operatör için 18 farklı olasılık vardır. Üçüncü operatörün kullanımını burada açıklamaya gerek yok fakat diğerlerine göre olasılıkları büyük ölçüde artırmakta. Bu yöntem sayesinde rahat bir şekilde, aynı sayıları program üretmeye devam etse bile, aynı sayılardan 20-25 farklı sayı elde edebiliriz. Ta ki 20-25 sayı üretildikten sonra yeniden örüntü baştan başlayana kadar. Benim çözüm yollarım bu kadardı. C dilinde bu konu hakkında internette yaptığım araştırmalarda daha farklı ve çeşitli çözüm yolları ve algoritmalar görmüştüm. Kısa bir araştırmayla bunlardan yararlanabilirsiniz. Umarım yardımcı olur. İyi çalışmalar.