Jeg tænkte bare over php rand()
-funktionen og tænkte på, hvordan jeg kunne genoprette den, og jeg kom op fuldstændig bedøvet.
Hvordan fungerer tilfældige talgeneratorer?
Kommentarer
Svar
Tilfældige talgeneratorer (RNGer) genererer virkelig pseudorandom-tal, da det er umuligt at generere et TRULY tilfældigt tal. De eneste virkelig virkelige tilfældige ting er handlinger af Gud ligesom lyn.
Denne wikipedia-artikel kan muligvis hjælpe dig med forklaringen: http://en.wikipedia.org/wiki/Random_number_generators
Fra hvad jeg forstår, er der grundlæggende to dele af en RNG: frøet og derefter det tilfældige tal valgt fra det frø. Når du frø RNG, giver du det svarer til en startpo int. Dette udgangspunkt har derefter en masse tal, der er “inde” i det, som programmet vælger fra. I PHP kan du bruge srand () til at “blande” frøene, så du næsten altid får et andet svar. Du kan derefter bruge rand (min, max) til at gå ind i frøet og vælge et tal mellem min og max inklusive.
ADVARSEL, MULIG CHEESY ANALOGI FREM!
Tænk på hvert “frø” som en iskiste, og derefter tilfældige tal som isterninger. Lad os sige, at du har 1000 iskister, og hver kiste har 1000 ister indeni. På amtsmessen vælger de en iskiste til at begynde at bruge til drinks, og de kan kun bruge en isterning. De har dog kun brug for isterninger større end 1 kubikcentimeter. Så de vælger tilfældigt en kiste mellem de 1000 kister, og derefter vælger de tilfældigt en isterning inde i kisten. Hvis det fungerer efter den størrelse, de ønsker, bruger de det. Hvis det ikke er tilfældet, lægger de det tilbage i brystet sammen med de andre. Hvis de ønsker at gøre det lidt sjovere, skifter de på forhånd kister for total glemsomhed, hvis du vil!
Hvad angår hvordan PHP faktisk fysisk vælger frøet og tilfældigt tal, jeg har ikke nok viden til det (hvilket sandsynligvis er det, du undrede dig mest over!). Jeg ville ikke prøve at gentage rand () -funktionen. For de fleste webbaserede applikationer, som du laver, skal rand () være tilstrækkeligt til ethvert tilfældigt tal, du har brug for.
Tjek også lineær kongruentiel generatorer, dette kan være mere af det, du leder efter, hvis du vil have de beskidte detaljer: http://en.wikipedia.org/wiki/Linear_congruential_generator
Håber det hjælper!
Kommentarer
- Hvordan ville handlinger af
god
være tilfældige i det mindste? Derudover er lynet heller ikke ‘ t tilfældigt, det følger en sti bestemt af forskellige forhold. Tolken, der genererer nummeret, er i det væsentlige irrelevant. - Jeg ‘ Jeg bruger Guds handlinger i juridisk forstand: da.wikipedia.org/wiki/Act_of_God De betragtes som tilfældige, da de er uden for tilsyneladende menneskelig kontrol.
- Så i det væsentlige er der intet, der er tilfældigt. Men det ville kræve, at enhver tilsyneladende tilfældig forekomst blev påvirket, hvilket ikke ‘ virker, når du kommer til begyndelsens tid …. Ser ud til at jeg ‘ Jeg vil tage nogle filosofiklasser = D
- @Korvin, så vidt vi ved, er kvantefænomener som radioaktivt henfald eller udsendelse af en foton af et ophidset atom virkelig tilfældige . Matematikere og filosoffer argumenterer dog for, hvad det vil sige at være virkelig tilfældig. Og mens almindelige folk synes, at en møntkast er ret tilfældig, kan agile scenekunstnere ( news.stanford.edu/pr/2004/diaconis-69.html ) regelmæssigt få 10 hoveder på 10 flip.
- @Charles – En møntkast er ikke ‘ t selv et binært hoveder / haler, det ‘ er faktisk hoveder / haler / kant, så en rigtig god scenemagiker kunne få det til hverken at falde ned i hoveder eller haler. * 8 ‘)
Svar
De er normalt ikke rigtig tilfældig, men kaldes pseudo-tilfældig, fordi de genererer en talrækkefølge, der synes tilfældig. Dette gøres med nogle interessante matematiske formler. En af de mest almindelige er Lineær kongruens Generator .
Pseudotilfældige tal har en nyttig egenskab, som sande tilfældige tal ikke betyder: Hvis du bruger det samme frø, når du starter, får du en identisk sekvens tilbage. Dette kan være meget praktisk til testning.
Kommentarer
- Hvis jeg ‘ jeg forstår dit andet udsagn korrekt:
random(5332)
vil altid være lig medrandom(5332)
? - @Korvin, nej jeg mener, hvis du ringer til
srand(5332)
så vil det næste nummer, der returneres afrand
, altid være det samme. - ” vises tilfældigt ” – > har samme statistiske egenskaber som virkelig tilfældige tal.
- +1 for LGC Wikipedia-linket, dette har en fremragende animation af, hvorfor enkle PRNGer har alvorlige begrænsninger, når man laver multidimensionale Monte-carlo-simuleringer.
Svar
Er y beder du om pseudorandom eller tilfældig? Andre svarede om pseudorandom, lad mig tale om tilfældigt.
Der var (er?) Faktiske hardwarebaserede tilfældige talgeneratorer til salg. De var baseret på en chip med en lille radio, der måler hvid støj fra dyb rumstråling eller en lille radioaktiv prøve og måler perioder mellem dens henfald. Problemet med dem var båndbredden – mængden af entropi, de kunne generere, var ikke meget høj, så de blev brugt til frø af pseudorandomalgoritmer. De blev brugt i banksystemer, høj sikkerhed og lignende.
OTOH, hvis du møder en integreret systemudvikler, vil de grine af disse. Til almindelige formål ved programmering af en mikrocontroller, læser lave 4 bits af enhver 16-bit Analog-Digital Converter, hvor en flydende (ikke-tilsluttet) pin giver en perfekt god tilfældig støj, med mere end tilstrækkelig båndbredde (jo kortere afstemningsperioden jo mere “støjende” aflæsningen) og lettere end at skrive den faktiske RNG-rutine. Og i betragtning af ADCer findes ofte implementeret i silicium af mikrokontrollere, ofte implementeret og ofte implementeret med 8 kanaler, hvorfra du måske har brug for 5 til din applikation, er det praktisk talt gratis.
Og selvom du ikke har en ADC, vil et par elementer, der er tilsluttet en digital GPIO-pin, give et ret godt støj. I indlejret er støj ev er til stede (og kæmpes konstant), og det er meget let at få noget sandt tilfældighed.
Svar
Der er mange måder at forsøge at efterligne en “tilfældig” rækkefølge af tal. Dit første stop skal være at læse om lineære kongruentielle generatorer , helt sikkert. Sådan fungerer de fleste grundlæggende tilfældige talgeneratorer, og jeg vil vædde på, at det er, hvordan PHPs rand () -funktion fungerer.
Det mere interessante næste spørgsmål at overveje er, hvordan det frø sig selv? Tid ? IP-adresse? Osv.
Kommentarer
- Frøet er det, der forvirrer mig, jeg kan ‘ tænk på noget, der muligvis kan frø funktionen uden nogen form for mønster, og selv hvis ikke, hvad er det, der forårsager, at det tilfældige frø genereres i første omgang!
- Jeg tror, at en tidsstempel ofte er brugt som et oprindeligt frø, når der faktisk ikke er nogen fra en anden kilde. I gamle BASIC var
RANDOMIZE TIMER
et almindeligt udtryk, og ” godt nok ” til de fleste (ikke-kryptografiske) formål. Ifølge man 3 srand bruger GNU C-biblioteket en fast frø på 1, indtil PRNG genoptages.
Svar
Først og fremmest næsten alle rand()
-funktioner giver ikke ægte tilfældighed, snarere giver de såkaldte pseudo-tilfældige tal.
Så hvordan fungerer pseudo-tilfældige talgeneratorer? Dybest set på samme måde som kryptering fungerer: Du har en funktion (en hash), der tager noget input og producerer noget output på en så kompleks måde, at det er umuligt fra output at gætte input eller omvendt. Det vil sige, Hver cypher kan bruges til at skabe en temmelig god pseudo-tilfældig generator. Selvom du i princippet kan bruge en hvilken som helst pseudo-tilfældig generator til at foretage kryptering, er de fleste pseudo-tilfældige talgeneratorer primært udviklet til hastighed, ikke kryptografisk sikkerhed, så de vil ikke give hackere hovedpine.
For en pseudo-tilfældig generator anvendes hash-funktionen til en eller anden skjult intern tilstand i generatoren, og dens output bruges til at) ændre den interne tilstand, og b) for at beregne output fra rand()
-funktionen. Den næste påkaldelse af rand()
bruger den ændrede interne tilstand og giver således et andet resultat. Jo bedre hash-funktionen, desto mindre skelnes resultaterne fra ægte tilfældige tal.
Faktisk har computere i dag adgang til reelle tilfældige tal: De stammer fra jitter i timingen for afbrydelser produceret af eksterne enheder. Linux bruger disse værdier af lille usikkerhed til konstant at røre en “entropipool”, som kun er et par kilobyte intern tilstand. Kryptografiske hashes baseret på denne entropipool gøres tilgængelige via /dev/random
og /dev/urandom
enhederne. Så adgang til nogle rigtig gode tilfældige tal er så simpelt som at åbne en af disse to enheder og læse nogle bytes fra dem.
Svar
Tilfældige tal er tal genereret af processen, hvis output er uforudsigelig. dvs. vi kan ikke fortælle, hvad der bliver næste output. Vi kan tage nogle enkle eksempler på terningerne. Hvad der skal sendes, når vi kaster terninger, er uforudsigeligt.
Der er to typer tilfældige tal 1. Ægte tilfældige tal 2. Pseudo tilfældige tal.
Hvordan tilfældige tal genreres
Kommentarer
- Brug citatformatering til at fremhæve hvilke dele af svaret er dit, og som er fra den kilde, du citerer. Hvis alt dit svar er, er en kopi / indsæt fra en ekstern kilde, er det ‘ ikke et godt svar her.
- dette betyder ikke ‘ ser ikke ud til at tilbyde noget væsentligt over punkter, der er fremsat og forklaret i tidligere 6 svar
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }