Mietin vain php rand() -toimintoa ja ajattelin, kuinka voisin tehdä sen uudestaan, ja tulin ylöspäin täysin hämmentynyt.

Kuinka satunnaislukugeneraattorit toimivat?

Kommentit

  • Pseudo-satunnaislukugeneraattorit käyttävät siementä, a ennalta määriteltyjen vakioiden ja matemaattisten kaavojen taulukko. Todelliset satunnaislukugeneraattorit käyttävät yleensä ilmakohinaa. Voit helposti saada satunnaislukuja lukemalla / dev / random.
  • Onko ilmakohina taattu satunnaiseksi?
  • random.org: lla on melko hyvä keskustelu satunnaisluvuista ja niiden ’ uudelleenluomisesta .
  • function rand() { return 4; /* determined by die roll - guaranteed to be random */ }
  • Jonkun on tehtävä tämä: xkcd.com/221 😉

Vastaus

Satunnaislukugeneraattorit (RNG) tuottavat todella näennäissatunnaisia numeroita, koska TODELLA satunnaisluvun luominen on mahdotonta. Ainoat todella satunnaiset asiat ovat Jumala, kuten salama.

Tämä wikipedia-artikkeli saattaa auttaa sinua selityksessä: http://en.wikipedia.org/wiki/Random_number_generators


Ymmärtääkseni RNG: ssä on periaatteessa kaksi osaa: siemen ja sitten siemenestä valittu satunnaisluku. Kun kylvät RNG: tä, annat se vastaa alkavaa po int. Siinä lähtökohdassa on sitten joukko numeroita, jotka ovat ”sisällä” ja joista ohjelma valitsee. PHP: ssä voit käyttää srand (): ta ”sekoittaa” siemeniä, joten saat melkein aina toisen vastauksen. Sitten voit käyttää randia (min, max) siirtyäksesi siemeneen ja valita numero minin ja maxin välillä, mukaan lukien.


VAROITUS, MAHDOLLISTA JUUSTOSANALOGIAA EDELLE!

Ajattele jokaista ”siementä” kuin jäärintaa ja sitten satunnaislukuja jääkuutioina. Oletetaan, että sinulla on 1000 jääkourua ja jokaisessa rinnassa on 1000 jääkuutiota. Läänimessuilla he valitsevat jääkaapin, jota käytetään juomien valmistamiseen, ja he voivat käyttää vain yhtä jääkuutiota. He tarvitsevat kuitenkin vain suurempia kuin 1 kuutiometriä jääkuutioita. Joten he ”valitsevat rinnan satunnaisesti näiden 1000 arkin välillä, ja sitten he valitsevat jääkuution rinnassa satunnaisesti. Jos se toimii haluamallaan kokoon, he käyttävät sitä. Jos se ei ole, he panevat sen takaisin rinnalle muiden kanssa. Jos he haluavat tehdä siitä hieman hauskempaa, he vaihtavat rintakehän etukäteen täydellisen tietämättömyyden puolesta, jos haluat!

Mitä PHP: lle tulee itse valitsee fyysisesti siemen ja satunnaisluvun, minulla ei ole tarpeeksi tietoa siihen (mistä luultavasti mietit eniten!). En yritä toistaa rand () -funktiota; useimmille tekemäsi web-sovelluksille rand () riittää kaikille tarvitsemillesi satunnaisluvuille.

Katso myös lineaarinen yhteneväisyys generaattorit, tämä saattaa olla enemmän mitä etsit, jos haluat likaiset yksityiskohdat: http://en.wikipedia.org/wiki/Linear_congruential_generator

Toivottavasti tämä auttaa!

Kommentit

  • Kuinka god -toiminnot olisivat satunnaisia vähiten? Tämän lisäksi salama ei ole ’ t myöskään satunnainen, se seuraa eri olosuhteiden määrittelemää polkua. Numeron tuottavalla tulkilla ei myöskään ole oleellisesti merkitystä.
  • I ’ m käyttäen Jumalan tekoja oikeudellisessa mielessä: fi.wikipedia.org/wiki/Act_of_God Heitä pidetään satunnaisina, koska ne eivät ole ilmeisen ihmisen hallinnassa.
  • Joten mikään ei ole satunnaista. Mutta se edellyttäisi vaikutusta jokaiseen näennäisesti satunnaiseen esiintymiseen, joka ’ ei toimi, kun pääset ajan alkuun …. Näyttää siltä, että minä ’ aan mennä joihinkin filosofian luokkiin = D
  • @Korvin, sikäli kuin tiedämme, kvantti-ilmiöt, kuten radioaktiivinen hajoaminen tai viritetyn atomin aiheuttama fotonin emissio, ovat aidosti satunnaisia . Matemaatikot ja filosofit kuitenkin väittävät, mitä tarkoittaa olla todella satunnainen. Ja vaikka tavalliset ihmiset ajattelevat kolikon heiton olevan melko satunnaista, ketterät näyttelijät ( news.stanford.edu/pr/2004/diaconis-69.html ) voivat säännöllisesti saat 10 päätä 10 läpällä.
  • @Charles – Kolikonheitto ei ole ’ edes binäärinen pää / häntä, se ’ t ovat itse asiassa päät / hännät / reunat, joten todella hyvä näyttämävoittaja voisi saada sen tulemaan päähän eikä häntään. * 8 ’)

Vastaa

He yleensä eivät ole todella satunnaisia, mutta niitä kutsutaan näennäissatunnaisiksi, koska ne tuottavat satunnaiseksi näyttävän numerosekvenssin. Tämä tehdään mielenkiintoisilla matemaattisilla kaavoilla. Yksi yleisimmistä on lineaarinen kongruenttinen Generaattori .

Pseudo-satunnaisluvuilla on yksi hyödyllinen ominaisuus, jota tosi satunnaisluvut eivät t: jos käytät samaa siementä aloittaessasi, saat saman identtisen sekvenssin. Tämä voi olla erittäin kätevä testauksessa.

Kommentit

  • Jos olen ’ ymmärtänyt toisen lausekkeen oikein: random(5332) on aina yhtä suuri kuin random(5332)?
  • @Korvin, ei, tarkoitan jos soitat srand(5332) seuraava numero, jonka palauttaa rand, on aina sama.
  • ” näyttää satunnaiselta ” – > on samat tilastolliset ominaisuudet kuin todella satunnaisluvuilla.
  • +1 LGC Wikipedia -linkille, tällä on erinomainen animaatio siitä, miksi yksinkertaisilla PRNG: llä on vakavia rajoituksia, kun tehdään moniulotteisia Monte-carlo-simulaatioita.

Vastaa

Ovatko y pyydätkö näennäissatunnaista vai satunnaista? Toiset vastasivat näennäissatunnaisuudesta, haluan puhua satunnaisesta.

Myynnissä oli (on?) Todellisia laitteistopohjaisia satunnaislukugeneraattoreita. Ne perustuivat siruun, jossa oli pieni radio, jolla mitattiin syvän avaruuden säteilyn valkoista kohinaa, tai pieneen radioaktiiviseen näytteeseen ja mitattiin hajoamisen välisiä jaksoja. Heidän ongelmansa oli kaistanleveys – niiden tuottaman entropian määrä ei ollut kovin suuri, joten niitä käytettiin näennäissatunnaisalgoritmien siemeniin. Niitä käytettiin pankkijärjestelmissä, erittäin turvallisissa ja vastaavissa.

OTOH, jos tapaat upotettujen järjestelmien kehittäjiä, he nauravat näistä: Mikrokontrollerin ohjelmoinnin yleisiin tarkoituksiin lukemalla minkä tahansa 16-bittisen analogisen ja digitaalisen muuntimen matalat 4 bittiä kelluvalla (kytkemättömällä) nastalla saadaan erittäin hyvä satunnainen melu yli riittävällä kaistanleveydellä (mitä lyhyempi äänestysjakso, sitä ”meluisempi” lukema on) ja helpompaa kuin varsinaisen RNG-rutiinin kirjoittaminen.Ja ottaen huomioon, että ADC: t ovat yleisesti toteutettuja mikrokontrollerien piissä, yleisesti toteutettu ja usein toteutettu 8 kanavaa, joista tarvitset ehkä 5 sovelluksellesi, se on käytännössä ilmainen.

Ja vaikka sinulla ei olisikaan ADC: tä, pari digitaaliseen GPIO-nastaan liitettyä elementtiä tuottaa melko hyvän Upotettuna melu on ev er-läsnä (ja taisteli jatkuvasti), joten todellisen satunnaisuuden saaminen on erittäin helppoa.

Vastaus

On monia tapoja yrittää jäljitellä ”satunnaista” numerosarjaa. Ensinnäkin sinun tulisi lukea lineaariset kongruenttigeneraattorit , varmasti. Näin tavallisimmat satunnaislukugeneraattorit toimivat, ja varmaan vedon siitä, kuinka PHP: n rand () -toiminto toimii.

Mielenkiintoisempi seuraava pohdittava kysymys on, kuinka se siemenää itseään? ? IP-osoite? Jne.

Kommentit

  • Hämmentävä siemen on, voin ’ älä ajattele mitään, mikä voi siementää funktion ilman jonkinlaista mallia, ja vaikka ei, niin mikä aiheuttaa satunnaisen siemenen syntymisen ensinnäkin!
  • Uskon, että aikaleima on usein käytetään alkuperäisenä siemenenä, kun mitään ei tosiasiallisesti toimiteta jostakin muusta lähteestä. Vanhassa BASIC-versiossa RANDOMIZE TIMER oli yleinen idioomi ja ” hyvä tarpeeksi ” useimpiin (ei-salaustarkoituksiin) tarkoituksiin. man 3 -sarjan mukaan GNU C -kirjasto käyttää kiinteä yhden siemen, kunnes PRNG on uudelleen kylvetty.

Vastaa

Ensinnäkin käytännöllisesti katsoen kaikki rand() -funktiot eivät tarjoa todellista satunnaisuutta, vaan pikemminkin ns. näennäissatunnaislukuja.

Joten miten näennäissatunnaislukugeneraattorit toimivat? Pohjimmiltaan samalla tavalla kuin salaus toimii: Sinulla on toiminto (hash), joka vie jonkin verran syötettä ja tuottaa osan tuotoksesta niin monimutkaisella tavalla, että lähdöstä on mahdotonta arvata syötettä tai päinvastoin. jokaista salakirjoitinta voidaan käyttää luomaan melko hyvä näennäissatunnaisgeneraattori. Vaikka voitkin käyttää mitä tahansa näennäissatunnaisgeneraattoria salauksen tekemiseen, useimmat näennäissatunnaislukugeneraattorit on kehitetty ensisijaisesti nopeutta, ei salausturvaa varten, joten ne ei anna hakkereille päänsärkyä.

Näennäissatunnaisgeneraattorille hajautusfunktiota käytetään generaattorin johonkin piilotettuun sisäiseen tilaan, ja sen lähtöä käytetään a) modifioimaan tätä sisäistä tilaa ja b) laskea funktion rand() lähtö. Seuraava rand() -kutsu käyttää muutettua sisäistä tilaa ja tuottaa siten toisenlaisen tuloksen. Mitä parempi hash-toiminto, sitä vähemmän tulokset ovat erotettavissa todellisista satunnaisluvuista.


Itse asiassa tietokoneilla on nykyään pääsy todellisiin satunnaislukuihin: Ne johtuvat värähtelystä ulkoisten laitteiden tuottamien keskeytysten ajoituksessa. Linux käyttää näitä pienen epävarmuuden arvoja jatkuvasti sekoittamaan ”entropiapoolia”, joka on vain muutama kilotavu sisäinen tila. Tähän entropiasarjaan perustuvat kryptografiset hajautusasetukset ovat käytettävissä /dev/random – ja /dev/urandom -laitteiden kautta. Joten pääsy joihinkin todella hyviin satunnaislukuihin on yhtä helppoa kuin avata toinen näistä kahdesta laitteesta ja lukea joitain tavuja niistä.

Vastaa

Satunnaisluvut ovat prosessin tuottamia lukuja, joiden lähtö on arvaamaton. ts. emme voi kertoa, mistä tulee seuraava tulos. Voimme ottaa yksinkertaisen esimerkin noppien tuloksesta. Se mitä tuotetaan, kun heitämme noppaa, on arvaamatonta.

Satunnaislukuja on kahta tyyppiä. Todelliset satunnaisluvut 2. Pseudo-satunnaisluvut. ”264aa60538”>

Kuinka satunnaiset numerot luodaan

Kommentit

  • Korosta mitkä osat vastaukset ovat sinun ja jotka ovat lähteestä, jonka mainitset. Jos vastauksesi on vain kopio / liitä ulkoisesta lähteestä, se ’ ei ole hyvä vastaus täällä.
  • tämä ei ole ’ ei näytä tarjoavan mitään merkittävää yli 6 vastauksessa esitettyjen ja selitettyjen kohtien yli.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *