Jeg tenkte bare på php rand()
-funksjonen, og tenkte på hvordan jeg kunne lage den på nytt, og jeg kom opp helt dumt.
Hvordan fungerer tilfeldige tallgeneratorer?
Kommentarer
Svar
Tilfeldige tallgeneratorer (RNGer) genererer virkelig pseudorandom-tall, siden det er umulig å faktisk generere et VIRKELIG tilfeldig tall. De eneste virkelig tilfeldige tingene er handlinger av Gud, som lyn.
Denne wikipedia-artikkelen kan kanskje hjelpe deg i forklaringen: http://en.wikipedia.org/wiki/Random_number_generators
Etter hva jeg forstår er det i utgangspunktet to deler av en RNG: frøet, og deretter det tilfeldige tallet valgt fra det frøet. Når du frø RNG, gir du det tilsvarer en startpo int. Det utgangspunktet har da en haug med tall som er «inni» det programmet velger fra. I PHP kan du bruke srand () til å «stokke» frøene, slik at du nesten alltid får et annet svar. Du kan deretter bruke rand (min, max) for å gå inn i frøet og velge et tall mellom min og max, inkludert.
ADVARSEL, MULIG CHEESY ANALOGY FREM!
Tenk på hvert «frø» som en iskiste, og deretter tilfeldige tall som isbiter. La oss si at du har 1000 iskister og hvert kiste har 1000 isbiter inni. På fylkessmessen vil de velge en iskiste å begynne å bruke til drikke, og de kan bare bruke en isbit. Imidlertid trenger de bare isbiter større enn 1 kubikkmeter. Så de velger tilfeldigvis en kiste mellom de 1000 kistene, og så velger de en isbit inne i kisten tilfeldig. Hvis det fungerer for størrelsen de vil ha, bruker de det. Hvis det ikke er det, legger de det tilbake i brystet sammen med de andre. Hvis de vil gjøre det litt morsommere, bytter de kister på forhånd for total glemsel, hvis du vil!
Når det gjelder hvordan PHP faktisk fysisk velger frøet og tilfeldig nummer, jeg har ikke nok kunnskap til det (som sannsynligvis er det du lurte mest på!). Jeg vil ikke prøve å gjøre om rand () -funksjonen. For de fleste nettbaserte applikasjoner du vil lage, skal rand () være tilstrekkelig for alle tilfeldige tall du trenger.
Sjekk også ut lineær kongruensiell generatorer, dette kan være mer av det du leter etter hvis du vil ha de skitne detaljene: http://en.wikipedia.org/wiki/Linear_congruential_generator
Håper dette hjelper!
Kommentarer
- Hvordan ville handlinger av
god
være tilfeldige i det minste? På toppen av det er lyn heller ikke ‘ t tilfeldig, det følger en sti bestemt av forskjellige forhold. Tolken som genererer tallet er i det vesentlige ikke relevant. - Jeg ‘ Jeg bruker Guds handlinger i juridisk forstand: en.wikipedia.org/wiki/Act_of_God De regnes som tilfeldige siden de er utenfor tilsynelatende menneskelig kontroll.
- Så egentlig er det ingenting som er tilfeldig. Men det vil kreve at alle tilsynelatende tilfeldigheter påvirkes, noe som ikke fungerer ‘ når du kommer helt til begynnelsen av tiden …. Ser ut som jeg ‘ kommer til å ta noen filosofiklasser = D
- @Korvin, så vidt vi vet, er kvantefenomener som radioaktivt forfall, eller utslipp av et foton av et opphisset atom, virkelig tilfeldige . Imidlertid argumenterer matematikere og filosofer hva det vil si å være virkelig tilfeldige. Og mens vanlige folk synes at et myntkast er ganske tilfeldig, kan smidige scenekunstnere ( news.stanford.edu/pr/2004/diaconis-69.html ) regelmessig få 10 hoder på 10 flips.
- @Charles – En myntkast er ikke ‘ t til og med en binær hode / hale, den ‘ er faktisk hoder / haler / kant, så en virkelig god scenekunstner kunne få den til å komme ned verken på hoder eller haler. * 8 ‘)
Svar
De er vanligvis ikke virkelig tilfeldig, men kalles pseudo-tilfeldig fordi de genererer en tallsekvens som virker tilfeldig. Dette gjøres med noen interessante matematiske formler. En av de vanligste er Lineær kongruens Generator .
Pseudo-tilfeldige tall har en nyttig egenskap som sanne tilfeldige tall ikke gjør: Hvis du bruker samme frø når du begynner, vil du få tilbake en identisk sekvens. Dette kan være veldig nyttig for testing.
Kommentarer
- Hvis jeg ‘ jeg forstår det andre utsagnet ditt riktig:
random(5332)
vil alltid være likrandom(5332)
? - @Korvin, nei jeg mener hvis du ringer til
srand(5332)
så vil neste nummer returnert avrand
alltid være det samme. - » vises tilfeldig » – > har samme statistiske egenskaper som virkelig tilfeldige tall.
- +1 for LGC Wikipedia-lenken, dette har en utmerket animasjon av hvorfor enkle PRNG-er har alvorlige begrensninger når du gjør multidimensjonale Monte-carlo-simuleringer.
Svar
Er y spør du om pseudorandom eller tilfeldig? Andre svarte om pseudorandom, la meg snakke om Random.
Det var (er?) Faktiske maskinvarebaserte Random Number Generators i salg. De var basert på en brikke med en liten radio som måler hvit støy fra dyp romstråling, eller en liten radioaktiv prøve og måler perioder mellom forfallet. Problemet med dem var båndbredden – mengden entropi de kunne generere var ikke veldig høy, så de ble brukt til frø av pseudorandom algoritmer. De ble brukt i banksystemer, høy sikkerhet og lignende.
OTOH, hvis du møter noen innebygde systemutviklere, vil de le av disse. For vanlige formål med programmering av en mikrokontroller, lesing av lave 4 biter av en hvilken som helst 16-bits Analog-Digital Converter med en flytende (ikke-tilkoblet) pinne vil gi en perfekt tilfeldig støy, med mer enn tilstrekkelig båndbredde (jo kortere avstemningsperioden jo mer «støyende» avlesningen), og lettere enn å skrive faktisk RNG-rutine. Og med tanke på at ADC-er ofte blir implementert i silisium av mikrokontrollere, ofte implementert, og ofte implementert med 8 kanaler som du kanskje trenger 5 for søknaden din, er det praktisk talt gratis.
Og selv om du ikke har en ADC, vil noen elementer som er koblet til en digital GPIO-pin, gi ganske bra støy. I innebygd er støy ev er tilstede (og kjempet hele tiden), og det er veldig enkelt å oppnå noe ekte tilfeldighet.
Svar
Det er mange måter å prøve å etterligne en «tilfeldig» sekvens av tall. Din første stopp bør være å lese om lineære kongruensielle generatorer , helt sikkert. Slik fungerer de fleste grunnleggende tilfeldige tallgeneratorer, og jeg vil satse at det er hvordan PHPs rand () -funksjon fungerer.
Det mer interessante neste spørsmålet å tenke på er hvordan det frø seg selv? Tid ? IP-adresse? Osv.
Kommentarer
- Frøet er det som forvirrer meg, jeg kan ‘ t tenk på noe som muligens kan frø funksjonen uten noe slags mønster, og selv om ikke, hva er det som forårsaker at det tilfeldige frøet genereres i utgangspunktet!
- Jeg tror at en tidsstempel ofte er brukt som et første frø når ingen faktisk er gitt fra noen annen kilde. I gamle BASIC var
RANDOMIZE TIMER
et vanlig uttrykk, og » bra nok » for de fleste (ikke-kryptografiske) formål. I følge mann 3 srand bruker GNU C-biblioteket en fast frø på 1 til PRNG blir sådd på nytt.
Svar
Først av alt, nesten alle rand()
-funksjoner gir ikke ekte tilfeldighet, men de gir såkalte pseudo-tilfeldige tall.
Så, hvordan fungerer pseudo-tilfeldige tallgeneratorer? I utgangspunktet på samme måte som kryptering fungerer: Du har en funksjon (en hash) som tar noe input, og produserer noe output på en så kompleks måte at det er umulig fra utgangen å gjette inngangen eller omvendt. Det vil si Hver cypher kan brukes til å lage en ganske god pseudo-tilfeldig generator. Mens du kan bruke en hvilken som helst pseudo-tilfeldig generator for å gjøre kryptering i prinsippet, er de fleste pseudo-tilfeldige tallgeneratorer primært utviklet for hastighet, ikke kryptografisk sikkerhet, så de vil ikke gi hackere hodepine.
For en pseudo-tilfeldig generator blir hashing-funksjonen brukt på en eller annen skjult intern tilstand i generatoren, og utgangen brukes til å) modifisere den interne tilstanden, og b) for å beregne utdata fra rand()
-funksjonen. Neste påkallelse av rand()
vil bruke den endrede interne tilstanden, og dermed gi et annet resultat. Jo bedre hash-funksjonen er, desto mindre skiller man resultatene fra ekte tilfeldige tall.
Faktisk har datamaskiner i dag tilgang til reelle tilfeldige tall: De stammer fra jitter i tidspunktet for avbrudd produsert av eksterne enheter. Linux bruker disse verdiene av liten usikkerhet for kontinuerlig å røre et «entropipool», som bare er noen få kilobyte intern tilstand. Kryptografiske hashes basert på denne entropipoolen blir gjort tilgjengelig via /dev/random
og /dev/urandom
enhetene. Så tilgang til noen virkelig gode tilfeldige tall er så enkelt som å åpne en av disse to enhetene og lese noen byte fra dem.
Svar
Tilfeldige tall er tall generert av prosessen hvis utdata er uforutsigbar. dvs. vi kan ikke fortelle hva som kommer til å bli neste utgang. Vi kan ta noen enkle eksempler på terningene. Det som skal sendes ut når vi kaster terninger er uforutsigbart.
Det er to typer tilfeldige tall 1. Ekte tilfeldige tall 2. Pseudo tilfeldige tall.
Hvordan tilfeldige tall blir generert
Kommentarer
- Bruk sitatformatering for å markere hvilke deler av svaret er ditt og som er fra kilden du siterer. Hvis alt svaret ditt er, er å kopiere / lime inn fra en ekstern kilde, er det ‘ ikke et godt svar her.
- dette ‘ ser ikke ut til å tilby noe vesentlig over poeng gjort og forklart i tidligere 6 svar
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }