Rastgele Sayı Üretici
Merhabalar,
Multi-precision doğal sayılarda bölme yapan bir fonksiyonu test etmek için, C'deki rand()
fonksiyonu ile rastgele sayı oluştururken, oluşturduğum sayıların
yeterince rastgele olmadığına (artık o ne demekse) karar verdim. Fonksiyon içinde, çok
nadiren de olsa çalışması gereken bir if
bloguna, milyarlarca sayı üretmeme rağmen girememiştim.
Hal böyle olunca, C'deki rand()
fonksiyonuna alternatif olarak, RC4 tabanlı
bir rastgele sayı üretici oluşturdum.
Bu rastgele sayı üreticinin özelliği, küçük sayılara daha fazla ağırlık veriyor olması. Dolayısı ile, uniform dağılımda sayılar üretmiyor. Kriptografi alanında kullanılmaması gerektiğini de özellikle vurgulamak istiyorum. Kodlar aşağıdaki gibi;
Burada kullanmak isteyebileceğiniz iki fonksiyon var; fill_random
ve myarc4
. myarc4
fonksiyonu
RC4 şifrelemeden esinlenerek(!) yazdım. Her çağrıldığında, rastgele 8 bit bir değer döndürüyor. Ancak,
fonksiyonu kullanmadan önce, program başlangıcında bir kez init_rng
fonksiyonunu çağırmanız gerekiyor.
Argüman olarak statik bir string verirseniz, her seferinde aynı sayıları üretir. Eğer istediğiniz bu değilse,
key
olarak kullanılacak string'i /dev/urandom
'u okuyarak veya CryptGenRandom
fonksiyonunu kullanarak oluşturup, bununla birlikte init_rng
fonksiyonunu çağırabilirsiniz.
Herhangi uzunluktaki 32bit integer array'ini rastgele sayılarla doldurmak için, fill_random
fonksiyonu
kullanabilirsiniz. İlk argüman olarak array'i, ikinci argüman olarak da array uzunluğunu göndermeniz gerekiyor.
Yukarıda da bahsettiğim gibi, burada oluşacak sayılar, sıfıra doğru meyilli. Yaklaşık olarak 1/32 ihtimalle 0,
1/32 ihtimalle 1, 1/64 ihtimalle 2 ve 3 döndürmesini bekleyebilirsiniz.
Standart kütüphanedeki rand()
fonksiyonuna nazaran oldukça yavaş kalabilir, ama, farklı bir dağılıma
sahip rastgele sayılar üretmek isterseniz işinize yarayabileceğini düşünüyorum.
Kriptografi için kullanılmaması gerektiğini tekrar hatırlatayım.