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?
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }
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?
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }
Yanıtlar:
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!
god
En 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.
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.
srand(5332)
sonraki sayı rand
her zaman aynı olacaktır.
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.
"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.
RANDOMIZE 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.
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/random
ve /dev/urandom
aygı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.
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.