Jag funderade bara på php rand() -funktionen och funderade på hur jag kunde göra om den, och jag kom upp helt dumt.

Hur fungerar slumptalsgeneratorer?

Kommentarer

  • Pseudo slumptalsgeneratorer använder ett frö, en tabell över fördefinierade konstanter och matematiska formler. Verkliga slumpgeneratorer använder vanligtvis atmosfäriskt brus. Du kan enkelt få slumpmässiga siffror från läsning / dev / random.
  • Är atmosfärsljud garanterat slumpmässigt?
  • random.org har en ganska bra diskussion om slumpmässiga nummer och hur de ’ genereras .
  • function rand() { return 4; /* determined by die roll - guaranteed to be random */ }
  • Någon måste göra detta: xkcd.com/221 😉

Svar

Slumpmässiga talgeneratorer (RNG) genererar verkligen pseudorandom-siffror, eftersom det är omöjligt att faktiskt generera ett TROLLY-slumptal. De enda riktigt slumpmässiga sakerna är handlingar av Gud, som blixtar.

Denna wikipedia-artikel kan hjälpa dig i förklaringen: http://en.wikipedia.org/wiki/Random_number_generators


Enligt vad jag förstår finns det i princip två delar av en RNG: fröet och sedan det slumpmässiga talet som valts från det fröet. När du frö RNG, ger du det motsvarar en startpo int. Den utgångspunkten har sedan en massa siffror som är ”inuti” den som programmet väljer från. I PHP kan du använda srand () för att ”blanda” frön så att du nästan alltid får ett annat svar. Du kan sedan använda rand (min, max) för att gå in i fröet och välja ett tal mellan min och max, inklusive.


VARNING, MÖJLIG CHEESY ANALOGY AHEAD!

Tänk på varje ”frö” som en iskista, och sedan slumptalen som isbitar. Låt oss säga att du har 1000 iskistor och varje bröstkorg har 1000 isbitar inuti. På landsmässan väljer de en iskista att börja använda till drycker, och de kan bara använda en isbit. De behöver dock bara isbitar som är större än 1 kubikcentimeter. Så de väljer slumpmässigt ett bröstkorg mellan de 1000 kistorna, och sedan väljer de en isbit inuti bröstet slumpmässigt. Om det fungerar för den storlek de vill ha använder de det. Om det inte är, lägger de tillbaka det i bröstet med de andra. Om de vill göra det lite roligare byter de ut kistor på förhand för total glömska, om du vill!

När det gäller hur PHP faktiskt fysiskt väljer utsädet och slumptalet, jag har inte tillräckligt med kunskap för det (vilket är nog det du undrar mest om!). Jag skulle inte försöka göra om rand () -funktionen. För de flesta webbaserade applikationer som du kommer att göra, bör rand () räcka för alla slumpmässiga siffror du behöver.

Kolla även in linjär kongruentiell generatorer, det här kan vara mer av det du letar efter om du vill ha smutsiga detaljer: http://en.wikipedia.org/wiki/Linear_congruential_generator

Hoppas det hjälper!

Kommentarer

  • Hur skulle handlingar av god vara slumpmässiga i det minsta? Dessutom är blixten inte heller ’, den följer en väg som bestäms av olika förhållanden. Tolken som genererar numret är i huvudsak irrelevant.
  • Jag ’ Jag använder Guds handlingar i juridisk mening: /wiki/Act_of_God De betraktas som slumpmässiga eftersom de ligger utanför uppenbar mänsklig kontroll.
  • Så i princip finns det inget som är slumpmässigt. Men det skulle kräva att alla till synes slumpmässiga tillfällen påverkas, vilket inte ’ fungerar när du kommer till början av tiden …. Ser ut som att jag ’ kommer att ta några filosofikurser = D
  • @Korvin, såvitt vi vet är kvantfenomen som radioaktivt förfall eller utsläpp av en foton av en upphetsad atom verkligen slumpmässiga . Matematiker och filosofer hävdar dock vad det innebär att vara verkligt slumpmässig. Och medan vanliga människor tycker att ett myntkast är ganska slumpmässigt kan smidiga scentrollkarlar ( news.stanford.edu/pr/2004/diaconis-69.html ) regelbundet få 10 huvuden på 10 vändningar.
  • @Charles – Ett myntkast är inte ’ t även en binär huvuden / svans, den ’ är faktiskt huvuden / svansar / kantar, så en riktigt bra scentrollkarl kan få den att varken komma ner på huvuden eller svansarna. * 8 ’)

Svar

De är vanligtvis inte riktigt slumpmässigt, men kallas pseudoslumpmässigt eftersom de genererar en talföljd som verkar slumpmässig. Detta görs med några intressanta matematiska formler. En av de vanligaste är Linjär kongruens Generator .

Pseudoslumpmässiga siffror har en användbar egenskap som sanna slumpmässiga nummer inte gör: om du använder samma frö när du startar får du tillbaka en identisk sekvens. Detta kan vara mycket praktiskt för testning.

Kommentarer

  • Om jag ’ jag förstår ditt andra uttalande korrekt: random(5332) kommer alltid att vara lika med random(5332)?
  • @Korvin, nej jag menar om du ringer till srand(5332) kommer nästa nummer som returneras av rand alltid att vara detsamma.
  • ” verkar slumpmässigt ” – > har samma statistiska egenskaper som riktigt slumpmässiga siffror.
  • +1 för LGC Wikipedia-länken, detta har en utmärkt animering av varför enkla PRNG har allvarliga begränsningar när man gör multidimensionella Monte-carlo-simuleringar.

Svar

Är y Frågar du efter Pseudorandom eller Random? Andra svarade om pseudorandom, låt mig prata om Random.

Det fanns (finns?) Verkliga hårdvarubaserade Random Number Generators i försäljning. De baserades på ett chip med en liten radio som mätte vitt brus från rymdstrålning, eller ett litet radioaktivt prov och mätperioder mellan dess förfall. Problemet med dem var bandbredden – mängden entropi de kunde generera var inte så hög så de användes för frön av pseudorandom algoritmer. De användes i banksystem, hög säkerhet och liknande.

OTOH, om du träffar någon inbyggd systemutvecklare, kommer de att skratta åt dessa. För vanliga ändamål vid programmering av en mikrokontroller, läsning av låga 4 bitar av någon 16-bitars Analog-Digital-omvandlare med en flytande (icke ansluten) stift kommer att ge en perfekt bra slumpmässigt brus, med mer än tillräcklig bandbredd (ju kortare avfrågningsperioden desto mer ”bullriga” avläsningar), och lättare än att skriva verklig RNG-rutin. Och med tanke på ADC: er finns vanligtvis implementerade i kisel av mikrokontroller, ofta implementerade och ofta implementerade Åtta kanaler från vilka du kanske behöver 5 för din applikation, det är praktiskt taget gratis.

Och även om du inte har en ADC kommer några element som är anslutna till en digital GPIO-stift att ge en ganska bra I inbäddat är buller ev är närvarande (och kämpas ständigt), och det är väldigt enkelt att få en viss slumpmässighet.

Svar

Det finns många sätt att försöka efterlikna en ”slumpmässig” sekvens av siffror. Ditt första stopp bör vara att läsa om linjära kongruentiella generatorer , helt säkert. Så här fungerar de flesta grundläggande slumptalsgeneratorer, och jag slår vad om att det är hur PHP: s rand () -funktion fungerar.

Den mer intressanta nästa frågan att tänka på är hur det fröer sig själv? Tid ? IP-adress? Etc.

Kommentarer

  • Fröet är det som förvirrar mig, jag kan ’ tänk på någonting som möjligen kan utsäda funktionen utan någon form av mönster, och även om inte, vad orsakar det slumpmässiga fröet att genereras i första hand!
  • Jag tror att en tidsstämpel ofta är används som ett initialt frö när ingen faktiskt tillhandahålls från någon annan källa. I gamla BASIC var RANDOMIZE TIMER ett vanligt uttryck och ” bra tillräckligt ” för de flesta (icke-kryptografiska) ändamål. Enligt man 3 srand använder GNU C-biblioteket en fast utsäde av 1 tills PRNG sätts om.

Svar

Först och främst, nästan alla rand() -funktioner ger inte sann slumpmässighet, utan de ger så kallade pseudo-slumpmässiga nummer.

Så, hur fungerar pseudoslumpmässiga talgeneratorer? I grund och botten på samma sätt som kryptering fungerar: Du har en funktion (en hash) som tar lite inmatning och producerar en del utdata på ett så komplext sätt att det är omöjligt från utgången att gissa ingången eller tvärtom. Varje cypher kan användas för att skapa en ganska bra pseudoslumpgenerator. Medan du kan använda vilken pseudoslumpgenerator som helst för att göra kryptering i princip, är de flesta pseudoslumpgeneratorer främst utvecklade för hastighet, inte kryptografisk säkerhet, så de kommer inte att ge hackare huvudvärk.

För en pseudoslumpgenerator tillämpas hashing-funktionen i något dolt internt tillstånd hos generatorn, och dess utgång används för att a) ändra det interna tillståndet och b) för att beräkna utdata från rand() -funktionen. Nästa anrop av rand() kommer att använda det ändrade interna tillståndet och därmed ge ett annat resultat. Ju bättre hashfunktionen är, desto mindre kan resultaten skiljas från riktiga slumptal.


Faktum är att datorer idag har tillgång till verkliga slumpmässiga siffror: De härrör från jitter vid tidpunkten för avbrott som produceras av externa enheter. Linux använder dessa värden av liten osäkerhet för att ständigt röra en ”entropipool”, som bara är några kilobyte internt tillstånd. Kryptografiska hashes baserade på denna entropipool görs tillgängliga via /dev/random och /dev/urandom enheterna. Så tillgång till några riktigt bra slumpmässiga siffror är så enkelt som att öppna en av dessa två enheter och läsa några byte från dem.

Svar

Slumpmässiga siffror är siffror som genereras av processen vars output är oförutsägbar. dvs vi kan inte berätta vad som kommer att bli nästa utdata. Vi kan ta några enkla exempel på tärningarna. Vad som kommer att matas ut när vi kastar en tärning är oförutsägbart.

Det finns två typer av slumpmässiga nummer 1. Sanna slumpmässiga nummer 2. Pseudo slumpmässiga nummer. ”264aa60538”>

Hur slumpmässiga siffror genereras

Kommentarer

  • Använd offertformatering för att markera vilka delar av svaret är ditt och vilka kommer från den källa du citerar. Om allt ditt svar är att kopiera / klistra in från en extern källa är det ’ inte ett bra svar här.
  • det här ’ verkar inte erbjuda något väsentligt över poäng som har gjorts och förklarats i tidigare 6 svar

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *