Tocmai mă gândeam la funcția php rand()
și mă gândeam cum aș putea să o refac și am venit complet stupefiat.
Cum funcționează generatoarele de numere aleatorii?
Comentarii
Răspuns
Generatorii de numere aleatorii (RNG) generează cu adevărat numere pseudorandom, deoarece este imposibil să se genereze un număr ADEVĂRAT. Singurele lucruri cu adevărat aleatorii sunt actele de Doamne, ca fulgerul.
Acest articol de pe Wikipedia ar putea să te ajute în explicație: http://en.wikipedia.org/wiki/Random_number_generators
Din câte am înțeles, există în esență două părți ale unui RNG: sămânța și apoi numărul aleatoriu ales din acea sămânță. Când semănați RNG, dați este un echivalent cu un po de pornire int. Acest punct de plecare are apoi o grămadă de numere care sunt „înăuntru” din care alege programul. În PHP, puteți utiliza srand () pentru a „amesteca” semințele, astfel încât veți obține aproape întotdeauna un răspuns diferit. Puteți utiliza apoi rand (min, max) pentru a intra în semințe și alegeți un număr între min și max, inclusiv.
AVERTISMENT, ANALOGIA POSIBILĂ A BRANZEI ÎNAINTE!
Gândiți-vă la fiecare „sămânță” ca la un cufăr de gheață și apoi la numerele aleatoare ca la cuburi de gheață. Să presupunem că aveți 1000 de cufere de gheață și fiecare cufăr are 1000 de cuburi de gheață înăuntru. La târgul județean, ei vor alege un cufăr de gheață pentru a începe să-l folosească pentru băuturi și pot folosi doar un cub de gheață. Cu toate acestea, au nevoie doar de cuburi de gheață mai mari de 1 inch cub. Așa că vor alege un cufăr la întâmplare între cele 1000 de cufere și apoi vor alege un cub de gheață în interiorul acelui cufăr la întâmplare. Dacă funcționează pentru dimensiunea pe care o doresc, o folosesc. Dacă nu este, îl pun înapoi în piept cu ceilalți. Dacă vor să-l facă un pic mai distractiv, schimbă cufărul în prealabil pentru a nu uita total, dacă vreți!
În ceea ce privește modul în care PHP De fapt, alege fizic sămânța și numărul aleatoriu, nu am suficiente cunoștințe pentru asta (ceea ce probabil că te întrebai cel mai mult!). Nu aș încerca să refac funcția rand (); pentru majoritatea aplicațiilor bazate pe web pe care le veți realiza, rand () ar trebui să fie suficient pentru orice număr aleatoriu de care veți avea nevoie.
De asemenea, verificați linia congruențială generatoare, acest lucru ar putea fi mai mult din ceea ce căutați dacă doriți detaliile murdare: http://en.wikipedia.org/wiki/Linear_congruential_generator
Sper că acest lucru vă ajută!
Comentarii
- Cum ar fi aleatorii actele
god
în cel mai mic pic? În plus, fulgerul nu este nici t întâmplător, ci urmează o cale determinată de diferite condiții. De asemenea, interpretul care generează numărul este în esență irelevant. - I ‘ m folosind acte ale lui Dumnezeu în sensul juridic: en.wikipedia.org/wiki/Act_of_God Sunt considerate aleatorii, deoarece sunt dincolo de controlul uman aparent.
- Deci, în esență, nu există nimic care să fie aleatoriu. Dar asta ar necesita ca fiecare ocazie aparent aleatorie să fie influențată, ceea ce nu funcționează t funcționează când ajungi chiar la începutul timpului …. Se pare că eu Voi lua câteva clase de filozofie = D
- @Korvin, din câte știm, fenomene cuantice precum dezintegrarea radioactivă sau emisia unui foton de către un atom excitat sunt cu adevărat aleatorii . Cu toate acestea, matematicienii și filozofii susțin ce înseamnă să fii cu adevărat aleatoriu. Și, deși oamenii obișnuiți consideră că o aruncare de monede este destul de aleatorie, magicienii de scenă agili ( news.stanford.edu/pr/2004/diaconis-69.html ) pot în mod regulat obțineți 10 capete pe 10 clapete.
- @Charles – O aruncare de monede nu este chiar și capete / cozi binare, este este de fapt capete / cozi / margine, așa că un magician de scenă foarte bun ar putea să-l facă să nu coboare nici în capete, nici în cozi. * 8 ‘)
Răspuns
De obicei nu sunt cu adevărat aleatorii, dar sunt numite pseudo-aleatorii deoarece generează o secvență numerică care apare aleatorie. Acest lucru se realizează cu câteva formule matematice interesante. Una dintre cele mai frecvente este Linear Congruential Generator .
Numerele pseudo-aleatorii au o proprietate utilă pe care nu o au numerele aleatoare adevărate: dacă utilizați aceeași sămânță atunci când începeți, veți primi înapoi o secvență identică. Acest lucru poate fi foarte util pentru testare.
Comentarii
- Dacă înțeleg corect a doua afirmație:
random(5332)
va fi întotdeauna egal curandom(5332)
? - @Korvin, nu, adică dacă suni la
srand(5332)
apoi următorul număr returnat derand
va fi întotdeauna același. - ” apare aleatoriu ” – > au aceleași proprietăți statistice ca numerele cu adevărat aleatorii.
- +1 pentru link-ul LGC Wikipedia, acesta are un excelent animație a motivului pentru care PRNG-urile simple au limitări serioase atunci când fac simulări multidimensionale Monte-Carlo.
Răspuns
Are y ceri Pseudorandom sau Random? Alții au răspuns despre pseudorandom, permiteți-mi să vorbesc despre Random.
Au existat (există?) Generatori de numere aleatorii bazate pe hardware. S-au bazat pe un cip cu un radio mic care măsoară zgomotul alb al radiațiilor spațiale profunde, sau un eșantion mic radioactiv și măsură perioadele dintre decăderea acestuia. Problema cu ei a fost lățimea de bandă – cantitatea de entropie pe care o puteau genera nu era foarte mare, așa că au fost folosite pentru semințe de algoritmi pseudorandom. Au fost utilizate în sisteme bancare, securitate ridicată și like-uri.
OTOH, dacă întâlnești orice dezvoltator de sisteme încorporate, ei vor râde de acestea. În scopuri obișnuite în programarea unui microcontroler, citirea redusă a 4 biți a oricărui convertor analog-digital de 16 biți cu un pin plutitor (neconectat) va produce un bun zgomot aleatoriu, la o lățime de bandă mai mult decât suficientă (cu cât perioada de votare este mai scurtă, cu atât citirea este mai „zgomotoasă”) și mai ușoară decât scrierea rutinei reale RNG. 8 canale de la care aveți nevoie de 5 pentru aplicația dvs., este practic gratuit.
Și chiar dacă nu aveți un ADC, câteva elemente conectate la un pin digital GPIO vor produce un produs destul de bun. zgomot. În încorporat, zgomotul este ev er-prezent (și luptat în mod constant), astfel încât obținerea unei aleatorii adevărate este foarte ușoară.
Răspuns
Există mai multe moduri pentru a încerca să emulați o secvență „aleatorie” de numere. Prima dvs. oprire ar trebui să fie să citiți despre generatoare congruențiale liniare , cu siguranță. Acesta este modul în care funcționează cei mai mulți generatori de numere aleatorii de bază și aș paria că funcționează funcția rand () PHP (
Următoarea întrebare mai interesantă de gândit este cum se însămânțează? ? Adresă IP? Etc.
Comentarii
- Sămânța este ceea ce mă încurcă, pot Nu mă gândesc la orice ar putea să însămânțeze funcția fără un fel de tipar și chiar dacă nu, atunci ceea ce determină generarea semințelor aleatorii în primul rând! folosit ca o sămânță inițială atunci când niciunul nu este de fapt furnizat dintr-o altă sursă. În vechiul BASIC,
RANDOMIZE TIMER
era un idiom obișnuit și ” bun suficient ” pentru cele mai multe scopuri (necriptografice). Conform man 3 srand , biblioteca GNU C folosește un sămânță fixă de 1 până când PRNG este re-însămânțat.
Răspuns
În primul rând, practic toate rand()
nu furnizează aleatoriu adevărat, mai degrabă furnizează așa-numitele numere pseudo-aleatorii.
Deci, cum funcționează generatoarele de numere pseudo-aleatorii? Practic, în același mod în care funcționează criptarea: aveți o funcție (un hash) care acceptă o anumită intrare și produce o ieșire într-un mod atât de complex încât este imposibil să ghiciți intrarea din intrare sau invers. Adică, fiecare cifru poate fi folosit pentru a crea un generator pseudo-aleatoriu destul de bun. Cu toate acestea, deși puteți utiliza orice generator pseudo-aleatoriu pentru a efectua criptarea în principiu, majoritatea generatoarelor de numere pseudo-aleatorii sunt dezvoltate în primul rând pentru viteză, nu pentru securitate criptografică, deci Nu va oferi hackerilor nicio durere de cap.
Pentru un generator pseudo-aleator, funcția de hash este aplicată unei stări interne ascunse a generatorului, iar ieșirea sa este utilizată pentru a) modifica acea stare internă și b) pentru a calcula ieșirea funcției rand()
. Următoarea invocare a rand()
va utiliza starea internă modificată și va produce astfel un rezultat diferit. Cu cât funcția hash este mai bună, cu atât rezultatele se disting mai puțin ușor de numerele aleatorii adevărate.
De altfel, computerele au în zilele noastre acces la numere reale aleatorii: Ele provin din jitter în momentul întreruperilor produse de dispozitive externe. Linux folosește aceste valori de mică incertitudine pentru a agita în mod constant un „grup de entropie”, care reprezintă doar câțiva kilobite de stare internă. Hash-urile criptografice bazate pe acest grup de entropie sunt disponibile prin intermediul dispozitivelor /dev/random
și /dev/urandom
. Deci, accesul la niște numere aleatoare foarte bune este la fel de simplu ca deschiderea unuia dintre aceste două dispozitive și citirea unor octeți din acestea.
Răspuns
Numerele aleatorii sunt numere generate de procesul a căror ieșire este imprevizibilă. adică nu putem spune care va fi următoarea ieșire. Putem lua un exemplu simplu de rezultat al zarurilor. Ceea ce va fi afișat atunci când aruncăm un zar este imprevizibil.
Există două tipuri de Număr Aleator 1. Numere aleatoare adevărate 2. Numere aleatorii pseudo.
Cum se generează numerele aleatorii
Comentarii
- Vă rugăm să utilizați formatarea citatelor pentru a evidenția ce părți ale răspunsul este al tău și care provin din sursa pe care o citezi. Dacă răspunsul dvs. este doar o copiere / lipire dintr-o sursă externă, nu este un răspuns bun aici.
- acest lucru nu t pare să ofere ceva substanțial în ceea ce privește punctele aduse și explicate în cele 6 răspunsuri anterioare
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }