Rasgele sayı üreteçleri nasıl çalışır?


23

Ben sadece php rand()işlevini düşünmeye başlamıştım ve nasıl yeniden kurabileceğimi düşünüyordum ve tamamen şaşırdım.

Rasgele sayı üreteçleri nasıl çalışır?


2
Sözde rasgele sayı üreteçleri bir tohum, önceden tanımlanmış sabitlerin bir tablosu ve matematiksel formüller kullanır. Gerçek rasgele sayı üreteçleri genellikle atmosferik gürültü kullanır. / Dev / random okumadan rastgele sayıları kolayca alabilirsiniz.
sağ

Atmosferik gürültünün rastgele olacağı mı garanti ediliyor?

2
random.org, rastgele sayılar ve nasıl üretildikleri hakkında oldukça iyi bir tartışmaya sahiptir .
CanSpice 20:11

14
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }
Neil

3
Birisi bunu yapmak zorunda: xkcd.com/221 ;)
Valera Kolupaev 21:11

Yanıtlar:


7

Rastgele Sayı Üreteçleri (RNG'ler) gerçekten bir yalancı sayı üretiyor, çünkü gerçekten bir TRULY rasgele sayı üretilemiyor. Gerçekten gerçekten rastlantısal olan tek şey, şimşek gibi Tanrı'nın eylemleridir.

Bu wikipedia makalesi açıklamada size yardımcı olabilir: http://en.wikipedia.org/wiki/Random_number_generators


Anladığım kadarıyla, temelde bir RNG'nin iki kısmı var: tohum ve o tohumdan seçilen rasgele sayı. RNG'yi tohumladığınızda, bir başlangıç ​​noktasına eşdeğerdir. Bu başlangıç ​​noktasında, programın seçtiği “içinde” olan bir sürü sayı vardır. PHP'de, tohumları "karıştırmak" için srand () işlevini kullanabilirsiniz, böylece neredeyse her zaman farklı bir yanıt alırsınız. Daha sonra tohuma gitmek için rand (min, maks) kullanabilir ve min ve maks, dahil olmak üzere bir sayı seçebilirsiniz.


UYARI, Olası PEYNİR ANALOJİSİ HAYIR!

Her bir 'tohum' yu bir buz sandığı ve ardından rastgele sayıları buz küpleri olarak düşünün. Diyelim ki 1000 buz sandığınız var ve her sandık içinde 1000 buz küpü var. İlçe fuarında, içecekler için kullanmaya başlamak için bir buz sandığı seçecekler ve sadece bir buz küpü kullanabilecekler. Ancak, sadece 1 inç küpten daha büyük buz küpleri gerekir. Böylece bu 1000 sandık arasında rastgele bir sandık seçecekler ve ardından o göğsün içinde rastgele bir buz küpü seçecekler. İstedikleri boyut için çalışıyorsa, kullanırlar. Değilse, diğerleriyle birlikte göğsüne geri koyarlar. Eğer biraz daha eğlenceli hale getirmek istiyorlarsa, tamamen bilememek için sandıkları önceden değiştirmişler!

PHP'nin fiziksel olarak tohumu ve rastgele sayıyı nasıl seçtiğine gelince, bunun için yeterince bilgim yok (muhtemelen en çok merak ettiğiniz şey de budur!). Rand () işlevini yinelemeye çalışmam; Yapacağınız çoğu web tabanlı uygulama için rand () ihtiyacınız olan herhangi bir rastgele sayı için yeterli olmalıdır.

Ayrıca doğrusal uyumlu jeneratörlere de bakın, bu kirli detayları görmek istiyorsanız aradığınız şey olabilir: http://en.wikipedia.org/wiki/Linear_congruential_generator

Bu yardımcı olur umarım!


7
godEn ufak bi rastgele nasıl davranırdı ? Bunun üzerine, yıldırım da rastgele değil, çeşitli koşullarla belirlenen bir yolu takip ediyor. Ayrıca, sayıyı üreten tercüman, esasen alakasızdır.

7
Tanrı'nın eylemlerini yasal anlamda kullanıyorum: en.wikipedia.org/wiki/Act_of_God Görünüşe göre insan kontrolü dışında oldukları için rastgele kabul edilirler.

4
Yani aslında, rastgele olan hiçbir şey yok. Fakat bu, rastgele görünen her rastgele oluşumu etkileyecektir, ki bu, zamanın başlangıcına geldiğinizde işe yaramaz… Görünüşe göre, bazı felsefe dersleri alacağım gibi görünüyor = D

6
@Korvin, bildiğimiz kadarıyla, radyoaktif bozulma gibi kuantum olayları veya bir fotonun heyecanlı bir atom tarafından salınımı gerçekten rastgeledir. Ancak, matematikçiler ve filozoflar gerçekten rastgele olmanın ne demek olduğunu tartışıyorlar. Ve sıradan insanlar bozuk para atmanın oldukça rastgele olduğunu düşünürken, çevik sahne sihirbazları ( news.stanford.edu/pr/2004/diaconis-69.html ) düzenli olarak 10 yazıya 10 kafa atabilir.
Charles E. Grant

1
@Charles - Bir madeni para atma bile bir çift başlık / kuyruk bile değildir, aslında bir başlık / kuyruk / kenardır, bu yüzden gerçekten iyi bir sahne sihirbazı, ne başlık ne de kuyruktan aşağı gelebilir. * 8 ')
Mark Booth

18

Genellikle rastgele değillerdir, ancak rastgele görünen bir sayı dizisi oluşturdukları için sahte rastgele olarak adlandırılırlar. Bu, bazı ilginç matematiksel formüllerle yapılır. En yaygın olanlardan biri Doğrusal Kongruential Generator'dır .

Sözde rasgele sayılar, gerçek rastgele sayıların yapmadığı tek bir kullanışlı özelliğe sahiptir: eğer aynı tohumu kullanırsanız, başladığınızda aynı diziyi geri alırsınız. Bu test için çok kullanışlı olabilir.


İkinci ifadenizi doğru anlıyorsam: random(5332)her zaman eşit olur random(5332)mu?

2
@Korvin, hayır demek istersen aradığında bir srand(5332)sonraki sayı randher zaman aynı olacaktır.
Mark Ransom

3
"rastgele görünür" ->, rastgele sayılarla aynı istatistiksel özelliklere sahiptir.

LGC Wikipedia bağlantısı için +1, bu çok basit Monte-carlo simülasyonları yaparken basit PRNG'lerin neden ciddi kısıtlamaları olduğunu gösteren mükemmel bir animasyona sahip.
Mark Booth,

4

Pseudorandom mu yoksa Random mı mı istiyorsun? Diğerleri sözderandom hakkında cevap verdiler, Random hakkında konuşmama izin verin.

Satılmaya hazır gerçek donanım bazlı Rasgele Sayı Üreteçleri (var mı?). Derin uzay radyasyonunun beyaz gürültüsünü ölçen küçük bir radyosu olan çip ya da çürümesi arasında küçük bir radyoaktif örnek ve ölçüm periyodu temel aldılar. Onlarla ilgili sorun bant genişliği idi - üretebilecekleri entropi miktarı çok yüksek değildi, bu yüzden yalancı ve algoritmaların tohumlarında kullanıldılar. Banka sistemlerinde, yüksek güvenlikli ve benzerlerinde kullanılıyorlardı.

OTOH, herhangi bir gömülü sistem geliştiricisiyle tanışırsanız, bunlara gülecekler. Bir mikrodenetleyicinin programlanmasında genel amaçlar için, herhangi bir 16-bit Analog-Dijital Dönüştürücünün 4 bit'inin, bitmeyen (bağlı olmayan) bir pimden düşük bitlerinin okunması, yeterli bant genişliğinden daha fazla mükemmel bir rastgele ses üretecektir (yoklama süresi ne kadar kısa olursa o kadar " gürültülü "okuma) ve gerçek RNG rutin yazma daha kolay. ADC'lerin yaygın olarak uygulandığı ve genellikle uygulamanız için belki 5'e ihtiyaç duyduğunuz 8 kanalla uygulandığı, mikrodenetleyicilerin silikonunda yaygın olarak bulunduğunu göz önünde bulundurarak pratikte ücretsizdir.

ADC'niz olmasa bile, bir dijital GPIO pinine bağlı birkaç eleman oldukça iyi bir ses çıkarır. Gömülü olarak, gürültü her zaman mevcuttur (ve sürekli olarak mücadele edilmiştir) ve bu nedenle bazı gerçek rastgelelikler elde etmek çok kolaydır.


2

"Rasgele" bir sayı dizisini taklit etmeye çalışmak için birçok yol vardır. İlk durağınız elbette lineer uygun jeneratörleri okumak olmalı . Temel rasgele sayı üreticilerinin çoğu bu şekilde çalışır ve PHP'nin rand () işlevinin nasıl çalıştığını iddia ediyorum.

Düşünmek için daha ilginç bir sonraki soru, kendisini nasıl ekiyor? Zaman? IP adresi? vb.


Tohum kafa karıştırıcı olan şeydir, işlevi bir çeşit düzen olmadan tohumlayabilecek hiçbir şey düşünemiyorum, ve olmasa bile, ilk etapta rastgele tohumun üretilmesine neden olan şey!

3
Hiçbir zaman başka bir kaynaktan temin edilmediğinde zaman damgasının çoğu zaman ilk tohum olarak kullanıldığına inanıyorum. Eski BASIC’teRANDOMIZE TIMER ortak bir deyim ve çoğu (kriptografik olmayan) amaçlar için "yeterince iyi" idi. İnsan 3 zincirine göre , GNU C kütüphanesi, PRNG yeniden tohumlanana kadar 1 sabit tohum kullanır.
bir CVn

1

Her şeyden önce, neredeyse tüm rand()işlevler gerçek rastgelelik sağlamaz, aksine sözde rasgele sayılar sağlarlar.

Peki, sözde rasgele sayı üreteçleri nasıl çalışıyor? Temelde şifreleme aynı şekilde çalışır: Bazı girdi alan bir fonksiyonunuz (hash) vardır ve bazı çıktıları karmaşık bir şekilde üretir; girdiyi tahmin etmek veya çıktıyı tahmin etmek imkânsızdır. Yani, her şifre oldukça iyi bir sözde rasgele jeneratör oluşturmak için kullanılabilir. Bununla birlikte, prensip olarak şifreleme yapmak için herhangi bir sözde rastgele oluşturucu kullanabilseniz de, çoğu sözde rastgele sayı üreteci kriptografik güvenlik için değil, özellikle hız için geliştirilmiştir, bu nedenle korsanlara herhangi bir baş ağrısı vermezler.

Sözde rastgele bir üretici için karma işlevi, jeneratörün bazı gizli dahili durumuna uygulanır ve çıktısı, a) bu dahili durumu değiştirmek ve b) rand()fonksiyonun çıkışını hesaplamak için kullanılır . Bir sonraki çağrı, rand()bu değişmiş içsel durumu kullanacak ve böylece farklı bir sonuç üretecektir. Karma işlevi ne kadar iyi olursa, sonuçlar o kadar az kolay gerçek rasgele sayılardan ayırt edilebilir.


Nitekim, günümüzde bilgisayarlar gerçek rastgele sayılara erişebiliyor: Harici cihazların ürettiği kesintilerin zamanlaması konusunda titremelerden kaynaklanıyorlar. Linux, sadece birkaç kilobaytlık bir iç durum olan bir "entropi havuzunu" karıştırmak için bu küçük belirsizlik değerlerini kullanır. Bu entropi havuzuna dayalı kriptografik karmalar /dev/randomve /dev/urandomaygıtlar aracılığıyla kullanıma sunulur . Bu yüzden, gerçekten çok iyi rastgele sayılara erişim, bu iki cihazdan birini açmak ve onlardan bazı baytları okumak kadar kolaydır.


-2

Rastgele Sayılar çıktısı öngörülemeyen süreç tarafından üretilen sayılardır. yani bir sonraki çıkışın ne olacağını söyleyemeyiz. Zarların bazı basit örnek sonuçlarını alabiliriz. Bir zar attığımızda ne çıkacağı tahmin edilemez.

İki tür Rastgele Sayı 1 vardır. Gerçek rastgele sayılar 2. Sahte rasgele sayılar.

Rasgele sayılar nasıl üretilir?


1
Lütfen cevabın hangi kısımlarının size ait olduğunu ve hangisinin sizin belirttiğiniz kaynaktan olduğunu vurgulamak için teklif formatını kullanın. Tüm cevabınız harici bir kaynaktan bir kopyala / yapıştır ise, burada iyi bir cevap değil.
Mat

Bu, önceki 6
cevapta
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.