Az önce otururken aklıma bilgisayarların random sayıları nasıl ürettiği takıldı. Bir mantığı olması gerekiyor ama ne biraz kafa yordum ve pek bir şey gelmedi aklıma nedir bunun mantığı?
pointerlarla felan bir bağlantısı olabilir mi acep
çok eskilerden bir oyun olan knight online’da bu zamana göre işliyordu. örneğin saat 15.30:23 ise (23 saniye, ayrıca muhtemelen timestamp alarak bu işlemleri yapıyordu yani insanın okuyabileceği bir şekilde olmuyordu) bu zaman üzerinde bazı matematiksel işlemler yaparak random sayı üretiyordu. ayrıca pek çok yerde bilgisayarların rastgele sayılar üretmediğini, sayıyı üretme algoritması çözüldüğü takdirde bilgisayarın üreteceği sayının bilinebileceğini okumuştum. ayrıntılı bilgi:
Computers can generate truly random numbers by observing some outside data, like mouse movements or fan noise, which is not predictable, and creating data from it. This is known as entropy. Other times, they generate “pseudorandom” numbers by using an algorithm so the results appear random, even though they aren’t.
2006 tarihli sozluk entry’mden:
Pseudorandom Number Generator
ks. prng
, deterministik herhangi bir yolla sozde rastgele bir sayi ureten algoritma/aletlere verilen isimdir. ureten aletin hafizasi sinirligi oldugu icin, bir noktadan sonra seri kendini tekrar etmeye baslayacaktir.
genelde seed
adi verilen bir baslangic degeri uzerinde cesitli kompleks matematiksel islemler gerceklestirip, belli bir sinir icerisinde rastgele bir sayi uretirler. daha sonra, bu sayi (ve opsiyonel olarak seed
) kullanilarak baska bir sayi uretilir. bu boyle devam eder…
kimi aplikasyonlar icin hakkaten rastgele sayi ureten algoritmalardan bir ustunlugu ise, ayni seed
verilen bir prng
’nin ayni seriyi uretmesidir. (nereyle ayni? … biraz turkce’yi katlettik ama olsun, anladiniz siz)
bu sayede, random
olarak uretilen data setinin tamaminin tek bir sayiya indirgenmesi, random
sayilarin tamaminin tek bir sayiya sikistirilmasi mumkundur.
bir de basit bir lcg
implementasyonu deneyelim:
x[0] = seed;
x[n+1] = (239*x[n] + seed+1) % 101;
yiyo mu?
seed = 0
x{} = 1, 38, 94, 45, 50, 33, 10, 68, 93, 8
seed = 1
x{} = 39, 31, 38, 95, 83, 43, 78, 60, 0, 2
seed = 1024
x{} = 28, 41, 17, 38, 7, 72, 53, 57, 3, 25
seed = 123456
x{} = 81, 2, 8, 28, 61, 70, 100, 99, 62, 6, 55, 50, 67, 90, 32, 7, 92, 5, 18, 95
seed = 123457
x{} = 18, 96, 53, 78, 94, 80, 67, 91, 70, 0, 36, 55, 51, 4, 83, 77, 57, 24, 15, 86
hic de fena diil aslinda.
tabi ki normalde dagilimi, periyodu, fonksiyonun matematiksel ozelliklerini, vs. test etmek lazim, ama boyle calisiyolar.
Bu rastgele olmayan bir yontem. Cogunlukla bu kullaniliyor.
Hakiki rastgelelik icin disaridan girdiye ihtiyac var. Boyle bir alet oldugunda yukaridaki teknikler aletin rastgeleligiyle karistirilip hakiki rastgele cikti elde ediliyor.
Bu arada kriptografik hash ve sifreleme fonksiyonlari tanim geregi rastgele. Ciktilarini hakiki rastgelelikten ayirt edebiliyor olmak, girdileri hakkinda bilgi sahibi olabilmek demek (ve bu istenmeyen bir ozellik.)
Tek baglantisi ASLR kullanilan sistemlerde bazi pointer’larin ust bitlerinin bir PRNG’den gelebiliyor olmasi.
Biraz karmaşık ama 2 kez bakınca mantıklı geliyor bir ara test etmek istiyorum bunu
random çalışır
(Bunu yapmasaydım kesinlikle ölürdüm)
yaptığınız içinde ben öldüm