Şimdi bilgisayardan 1-20 arası rastgele bi rakam belirlemesini istediğimizde, süreç nasıl işliyor? Nasıl belirliyor rakamı?
saat ve tarihi belli bi işlemlerden geçirip rastgele bi sonuç üretiyor :)
sonlu durum makinesi işte. aynı girdi aynı fonksiyonda aynı çıktıyı üretmek durumunda. random diye bir şey yok. rastgelelik için kendi dışındaki etkenlere bakması lazım.
sistem saatinin modunu alıyor 20 ye göre mesela.
sürekli değişen değerler referans alınarak (saat gibi) üretilir.
iso doğru söylemiş. bilgisayarın ürettiği random sayı gerçek bir random değil. ama yapılan basit bir random sayı talebi ise kullanılıyor elbette. ancak teknik anlamda gerçek random değil.
Hiçbir şey rastgele değil ^^
Arkadaşın dediği gibi belli bir tarih\saat aralığındaki milisaniyeye göre üretebilir, işletim sisteminin yada işlemcinin sürekli kullandığı zamanlayıcıya göre ütetilebilir, timerlara göre üretilebilir.
1-20 arası rakamı seçme kurgusunu siz de kendinize göre yapabilirsiniz. Son terim + ilk terim = 21. yani seçebileceğimiz 21 tane sayı var. Her rastgele sayı üretimi istenildiğinde o anki milisaniye değerini alıp, son terimin modunu alıp, milisaniye cinsindeki değere bölüp, son terimden çıkarabilirsiniz. Buna göre de 20'den büyük olmaması için milisaniye değerine göre koşul yazarsınız. Milisaniye cinsindeki değer 20den büyükse saniye bakarsınız, falan falan falan.
^_^
random algoritması o kadar dandiktir ki.
VB.6 da
bir komut vardı unuttum, onu yazmadan
rand() dersen devamlı aynı sayıyı bile verebiliyordu aynı dakika içerisinde.
zamanla ilgili yani kesinlikle.
zamanla ilgili olabilitesi olmasina ragmen her zaman zaman ile alakali degildir. random sayi su sekilde uretilir. Elimizde 1'den en buyuk tam sayiya kadar olan sayilarin tutuldugu bir dizi olsun. Belli bir fonksiyon ile bu dizi karistiriliyor. Daha sonra sen her random sayi istediginde bu diziden en bastan baslayarak sirayla sayilari sana veriyor. Random'un ne kadar random oldugunu belirleyen sey bu dizi karistirmak icin kullandigimiz fonksiyon. Bu fonksiyona verdiginiz degere gore serinin karisma sekli degisiyor. Bu degere 'seed' denir. Seed'i ayni verdigin surece ayni sirada cektigin random sayi her zaman ayni olacaktir. Bu seed icin bazi implementasyonlar saat degerini alir, bazilari cpu_clock denilen bir sey alir. Eger programciysan programin icin sen kendi seed'ini belirleyebilirsin. 1-20 arasinda istiyorsan da bu seriden aldigi sayinin mod 20'deki karsiligini doner.
@cruseo o aynı değeri vermesinin sebebi, öncesinde bir komut dediğin random fonksiyonuna verdiğin seed olmasın? seed vermezsen aynı sayıyı üretmesi normal.
daha önceki cevaplarda da söylenmiş, random belli fonksiyonların bir sonucu ve dolayısıyla deterministik, aynı input'u verdiğin zaman aynı output'u vermek zorunda. bu sebeple bu fonksiyonun bir şekilde seed edilmesi gerekiyor, bunda da genelde sistem saati kullanılır. C'de sistem saatiyle random fonksiyonunu seed etmek için srand(time(null)) gibi bir şey dersin mesela programın bir anında, bundan sonra rand() fonksiyonuyla üreteceğin sayılar random olur. Ama mesela her rand çağırmandan önce srand yaparsan iki komutun işlenmesi arasında geçen cpu cycle sayısı aynı olacağı için sana sürekli aynı değeri döndürür.
Java'nın random class'ından üretilen random'lar epey başarılı bulunur mesela, tabi ki sistemde tek değişkenimiz saat değil, ekrana giden output, klavyeden girilen input, diğer donanımların mevcut state'leri gibi birçok farklı öğe kullanılabilir, java da birçok farklı yerden farklı değer alarak bir random sayı üretiyor, bu da java'nın randomunu daha başarılı yapıyor.
Bu randomlar hep aynı input tekrar verildiğinde aynı output'u verecekleri için pseudo-random. Gerçek random için bazı donanımsal çözümler var, bir adet random number generator alıyorsun mesela, bu bir donanım, içinde yanlış bilmiyorsam radyoaktivite ile ilgili bir şeyler var ve bunlara dayanarak öngörülemeyecek sonuçlar üretiyor, bu bir çözüm.
Ayrıca internette gerçek random number sağlayıcılar var, hatta onlardan parayla hizmet alabiliyor, sundukları apileri falan kullanabiliyorsun. Onlar da uzaydaki sinyalleri falan baz alıyorlar, değişken sayısı sonsuza yaklaştıkça random da o kadar real random oluyor.
Ha bir random generator'ın ürettiği sayılar ne kadar random'dur, bu da monte carlo methodları ile belirleniyor, istersen araştırabilirsin.
Bu işin fazla derinine inersen felsefi tartışmalara kadar gidiyorsun. Son olarak: dilbert.com