2009-08-31 27 views
13

Her dil rasgele() bir işlevi veya rasgele rasgele sayı üretmek için benzer bir şey vardır. Bu sayıları üretmek için ne olacağını merak ediyorum? Bu bilgiyi gerekli kılan hiçbir şeyi programlamıyorum, sadece kendi merakımı tatmin etmeye çalışıyorum.random() aslında nasıl çalışır?

+4

Vikipedi makalesini okuduktan sonra, hangi özel sorularınız oldu? http://en.wikipedia.org/wiki/Random_number_generation –

+0

Bazı rasgele sayı üreteçleri, Internet Explorer Önbelleğini ve kullanıcı profilinizdeki merkezi Windows geçici klasörünü okur. Karşılaştığı her dosyadan 1 KB veri okuyarak, dikkat çekici şekilde rastgele bir sayı oluşturulur. İyi oluşturulmuş bir soru için –

+0

+1. -2 ne olursa olsun belirgin bir araştırma için. –

cevap

12

Donald Knuth'un seminal numaralı çalışmasının ilk bölümünün tamamı, Seminumerical Algorithms numaralı çalışmanın rasgele sayı üretimi konusuyla ele alınır. Gerçekten bir SO cevabının ilgili konuları açıklamaya yaklaşacağını düşünmüyorum. Kitabı oku.

+0

Son birkaç on yıl içinde kitabı güncelledi mi? Artık en iyi kaynak değil. –

+2

Ve alternatifin ... ne? –

+1

Geçtiğimiz yıllarda, en azından ana akımda değil, rasgele sayıların temellerinde çok şey değişti sanmıyorum. Rasgele bir nesilde her zaman teorik araştırma makalelerine bakabiliriz, ama yine de Knuth'u bir sıçrama tahtası olarak tavsiye ederim. – Kena

4

Wikipedia page iyi bir referanstır. Kullanılan gerçek algoritma, dile ve dilin uygulanmasına bağlı olacaktır.

0

Yanıtı tam olarak cevaplamak için, rastgele işlev işletim sistemi tarafından sağlanır (genellikle).

Ancak işletim sisteminin bu rasgele sayıları nasıl oluşturduğu bilgisayar bilimlerinde özel bir alandır. Örneğin, yukarıdaki cevaplarda yayınlanan wiki sayfasını görün.

+2

Hayır, rastgele fonction her zaman dil sistemi tarafından sağlanır. Bazı entropi elde etmek için işletim sistemini kullanabilir, ancak C rand() işlevi (tipik olarak) yapmaz. –

+0

Neil'le aynı fikirdeyim, birçok işletim sistemi rastgele ve rastgele sayıdaki sayıdaki API'ları sağlıyor, ancak birçok standart kütüphane * ayrı * uygulamayı kanıtladı. Her halükarda, dokümanlar okunduktan sonra, bilim, gizlilik ya da parayla ilgili herhangi bir şey için güvenli olmayan bütün berrak lineer işlerin olduklarını varsaymalısınız. Belgeler bu konuda bazılarını onaylayacak, sonra başkaları tarafından yapılan iddiaları kontrol edeceksiniz. – dmckee

3

random() sözde bir sözde sayı üretici (PRNG) 'dir. Rastgele() çoğunlukla Doğrusal bir eşzamanlı jeneratör olarak uygulanır. Bu, X (n + 1) (aXn + c) modulo m formunun bir fonksiyonudur. Xn, oluşturulan psödo-kondom sayılarının dizisidir. Genarated sayı dizisi kolay tahmin edilebilir. Bu algoritma kriptografik olarak güvenli bir PRNG olarak kullanılamaz.

Wikipedia:Linear congruential generator

Ve O yarı yolda-iyi yalancı rasgele numaraları almak için şaşırtıcı olarak çıkıyor PRNG PRNG Diehard Tests

+0

Bir LCG tarafından üretilen rasgele sayılar vasat ve berbat arasında bir yerde olduğunu söylemeyi unutmuştunuz. – starblue

+0

Evet haklısınız, ancak bazı hızlı ve kirli rasgele sayı üretimi için sorun yok. PRNG üzerinde DIEHARD istatistiksel testlerini biliyor musunuz? Bu testlerde çoğu PRNG başarısızdır. L'Ecuyer tarafından –

+0

TestU01 de günümüzde güzel bir test çerçevesidir. Sadece olumsuz, hemen hemen tüm jeneratörler :-) – Joey

4

için Zor Ölen testlerde bakabilirsiniz. tutmak devlet sabit A (32x32 => 64 bit) ile çarpın x ardından da yeni duruma gelen B, ardından düşük 32-bit dönüş sabit ekleyin: Onlarca yıldır altın standart derece basit bir algoritma oldu x. A ve B'un dikkatli seçilmesi durumunda, bu aslında oldukça iyi çalışır. Hata ayıklama sırasında davranışı yeniden üretmek için Pseudorandom sayılarının da tekrar edilebilir olması gerekir. Bu nedenle, jeneratörü tohumlamak (x, yani, günün saati ile) hata ayıklama sırasında genellikle önlenir.

Son yıllarda, ve yanmaya müsait daha hesaplama döngüleri ile, daha sofistike algoritmalar bazıları aksi oldukça authoritive Seminumerical Algoritma yayınlanmasından beri icat mevcuttur. İşletim sistemleri, özel şifreleme amaçları için donanım ve ağ kaynaklı entropi bitleri sağlamaya başlamaktadır.

+2

(a) bir LCG yok * üretmek için tasarlanan bu değil, aslında neticede faktör, addend ve nasıl seçtiğinize bağlı olarak, felaket için oldukça korkunç modülü.(b) Daha iyi jeneratörler her zaman daha yavaş oldukları anlamına gelmez. Örneğin, MT19937, çoğu LCG uygulamasından daha hızlı çalışan mükemmel bir jeneratördür (şimdi değiştirilmiş olsa da). (c) Bir PRNG tekrarlanabilir çıktı ürettiğinde hata ayıklamada yardımcı olabilirken, simülasyonlarda kesinlikle zorunludur. – Joey

+0

Lütfen soruyu tekrar okuyun. En iyi algoritmayı sormuyordu, soru şu: Nasıl çalışıyorlar? Evet, Mersenne twister daha iyi bir algoritmadır. Ruby'nin kullandığı şey budur ve eğer soru "en iyisi" olsaydı tartışabilirdik. Bazı MT uygulamalarının başlatma için bir LCRNG kullanması dikkat çekicidir. – DigitalRoss

+0

Elbette, soru nasıl yapıldığını sorar, ancak bir LCG ile neyin yanlış olduğunu söylemek yanlıştır. MT'nin başlangıç ​​durumuna gelince, eğer doğru yapılırsa, bu yeterlidir. Önemli olan: (a) Eğer * tohumlarınızın * lineer bağımlılıklarınız olmadığı ve (b) jeneratörünüzün bir tanesini koymadığı durumlarda birden fazla RNG kullanırsanız. MT19937, önerilen başlatma yönteminin çıktı kalitesini etkilemeyecek şekilde tasarlandı. – Joey

0

İncelemek isteyebileceğiniz bir şey, Linux ve Mac OSX gibi bazı Unix benzeri OS'lerde bulunan rasgele aygıtların ailesidir. Örneğin, Linux'ta, çekirdek, çeşitli kaynaklardan entropiyi, daha sonra sahte rasgele sayı üretecini tohumlamak için kullandığı bir havuza toplar. Entropi, anahtar kaynaklardan, ağ olaylarından, sabit disk aktivitesinden ve (en çok) fare hareketlerinden en önemlisi, çeşitli sürücü kaynaklarından gelebilir. Bunun yanı sıra entropiyi toplamak için bazı teknikler de var, bazıları tamamen donanımda bile kullanılıyor.İki karakter cihazlar gelen ve Linux üzerinde rastgele bayt alabilirsiniz vardır, bunlar aşağıdaki şekilde davranırlar: o yeniden kullanır çünkü

  • /dev/urandom size kriptografik güvenli çok rastgele ama değil bayt sürekli akışı verir Havuzda her hangi bir entropi mevcut.
  • /dev/random, kriptografik olarak güvenli rastgele sayıları verir, ancak havuzda bulunan entropiyi kullandığı ve daha fazla entropi toplanırken blok oluşturduğu için sabit bir akış sağlamaz. o engellemez nedenle PRNG var ve Mac OSX farklı bir yöntem kullanır iken, (üniversitede yapılan) benim kişisel kriterler her-so-biraz daha az rastgele Linux çekirdeği daha olduğu göstermiştir ki

Not. Yine de yeterince iyi.

Bu yüzden, projelerimde rast gele ihtiyacım olduğunda, genellikle programımdaki bir algoritma için en azından tohum için rastgele aygıtlardan birini okumaya gidiyorum.

+0

'/ dev/urandom' hala kriptografik olarak güvenli bir PRNG'dir. Bunlar, jeneratörün durumu kolayca tahmin edilemeyecek şekilde tasarlandı (devletlerin tahmin edilemediği için var olan gerçek RNG'lerin aksine). Her halükarda, güvenlik gerektiren uygulamaların büyük bir çoğunluğu için bile, '/ dev/urandom' aklın bir seçimidir. Özellikle aynı sistemde birden fazla işlem veya kullanıcı ile '/ dev/random' kullanmaya çalışırken (ve uygulamanızın bitmesini beklerken) kesinlikle eğleneceksiniz :-) – Joey

İlgili konular