2017-02-16 16 views
9

Rastgele sayılarla ilgili büyük bir okul projesi üzerinde çalışıyorum, ancak Math.random() dönemini bulamıyorum. Sürüm 7.0.800.15 yüklü ve bir windows 10 bilgisayar çalışıyorum. I ilk değerleri kaydeder basit bir program ile süresini belirleyen denedik: Bir dizidekiJava Math.random dönemi

double num = Math.random(); 

ve daha sonra, yeniden bir satırda ve böylece bir dönem uzanacak aynı değerleri bulana kadar döngüler, ancak sonuç yok, dönem çok uzun.

Sorularım: Sürümümde Math.random()'un süresi nedir? Veya: Basit bir program kullanarak süreyi belirlemenin bir yolu var mı?

Düzenleme: JavaScript ile ilgili bir sayfaya işaret eden bir kaynak aldı, ilgili değildi

+0

Dönem ile ne demek istiyorsunuz? Aynı sonuca kadar olan çağrı sayısı geri döndü mü? – Izruo

+0

Java veya Javascript ile ilgili sorunuz mu var? Bağlantı Javascript hakkında konuşuyor. – Kayaman

+1

@Izruo Dönemde, aynı rakamlar tekrarlanmaya başlayan çağrıların sayısı –

cevap

5

Java'nın math.random 2^48 modüllü bir doğrusal congruential jeneratör kullanıyor. İyi seçilmiş parametrelere sahip sözde psödondom jeneratörü periyodu modüle eşittir. Görünüşe göre, Java'daki parametreler iyi bir şekilde seçilmiştir, bu nedenle uygulamada süre 2^48'dir.

Kaynaklar: linear congruential generator üzerine https://en.wikipedia.org/wiki/Linear_congruential_generator http://www.javamex.com/tutorials/random_numbers/java_util_random_algorithm.shtml#.WKX-gRJ97dQ

4

wiki Java (java.util.Random) 2 bir modüle sahip olarak değinir. Bu muhtemelen bir dönemdir, ancak bu tür rasgele jeneratörler hakkında daha fazla bilgi edinmeniz gerekebilir.

Bu soru (How good is java.util.Random?) da aynı dönemi belirtmektedir.

2

Diğer cevaplara eklemek ve rasgele sayı üreteçlerine biraz daha genel olarak yorum yapmak ve dönemin ne olduğunu belirlemek için bir program yazmak için, Birthday Paradox ve Gambler's Fallacy'un dikkat edin. x değerini yaratırsanız, bir sonraki sayı, diğer herhangi bir sayı kadar x olma olasılığı kadardır ve çoğaltmanız gerekenden önce oluşturmanız gereken sayıların sayısı aslında şaşırtıcı derecede küçüktür. Prensip olarak, dönemin bitiminden önce bazı kopyaları görmeye başlar, bu da bunu test etmek için bir program yazmayı zorlaştırır).

sqrt(2m * p(n))p(n) tarafından% 50'ye varan ya da öylesine can be approximated olasılıklar için bir yinelenen olasılığı sen hesaplanması için çalışıyoruz ve m seçenek sayısıdır olasılığıdır. 32 bit tam sayı için sqrt(2m * p(n)) = sqrt(2 * 2^32 * 0.5) = sqrt(2^32) = 65,536. Orada var - 65.536 rakamı oluşturduktan sonra yaklaşık bir 50-50 şansınız var. Eğer 2^32 + 1 değerleri oluşturduktan sonra

, Pigeonhole Principle sen gerekir (eğer 32 bit sayısını elde edip, elbette, varsayarak) bir yinelenen en azyarattı belirtir.

this question ile ilgili daha fazla bilgi edinmek için rastgele sayıların benzersiz olup olmadığına güvenebilirsiniz.