Ik was net aan het nadenken over de php rand()
-functie, en na te denken over hoe ik het opnieuw kon maken, en ik kwam volledig stomverbaasd.
Hoe werken willekeurige nummergeneratoren?
Reacties
Antwoord
Random Number Generators (RNGs) genereren echt pseudo-willekeurige getallen, aangezien het onmogelijk is om daadwerkelijk een ECHT willekeurig getal te genereren. De enige echt willekeurige dingen zijn handelingen van God, als bliksem.
Dit Wikipedia-artikel kan je misschien helpen bij de uitleg: http://en.wikipedia.org/wiki/Random_number_generators
Voor zover ik begrijp, zijn er in feite twee delen van een RNG: het zaad, en dan het willekeurige nummer dat uit dat zaad wordt gekozen. Wanneer je de RNG zaait, geef je het is een equivalent van een startpunt int. Dat startpunt heeft dan een aantal nummers die er “in” staan waaruit het programma kiest. In PHP kun je srand () gebruiken om de zaden te “shuffelen”, zodat je bijna altijd een ander antwoord krijgt. Je kunt dan rand (min, max) gebruiken om in de seed te gaan en een getal kiezen tussen de min en de max, inclusief.
WAARSCHUWING, MOGELIJKE KAASANALOGIE VOORUIT!
Beschouw elk “zaadje” als een ijskist en vervolgens de willekeurige getallen als ijsblokjes. Stel dat je 1000 ijskisten hebt en dat elke kist 1000 ijsblokjes bevat. Op de kermis kiezen ze een ijskist om te gebruiken voor drankjes, en ze kunnen maar één ijsblokje gebruiken. Ze hebben echter alleen ijsblokjes nodig die groter zijn dan 1 kubieke inch. Dus kiezen ze willekeurig een kist tussen die 1000 kisten, en dan kiezen ze willekeurig een ijsblokje in die kist. Als het werkt voor de maat die ze willen, gebruiken ze het. Als dat niet het geval is, leggen ze het terug in de kist met de anderen. Als ze het wat leuker willen maken, wisselen ze van tevoren van kisten voor totale onbewustheid, als je wilt!
Wat betreft PHP eigenlijk kiest fysiek het zaad en het willekeurige nummer, ik heb daar niet genoeg kennis voor (dat is waarschijnlijk waar je je het meest over afvroeg!). Ik zou niet proberen de functie rand () opnieuw uit te voeren; voor de meeste webtoepassingen die je maakt, zou rand () voldoende moeten zijn voor elk willekeurig getal dat je nodig hebt.
Bekijk ook lineair congruentieel generatoren, dit is misschien meer van wat u “zoekt als u de vuile details wilt: http://en.wikipedia.org/wiki/Linear_congruential_generator
Ik hoop dat dit helpt!
Reacties
- Hoe zouden handelingen van
god
willekeurig zijn in het minst? Bovendien is bliksem niet ‘ t willekeurig, het volgt een pad dat wordt bepaald door verschillende omstandigheden. Bovendien is de tolk die het nummer genereert in wezen irrelevant. - Ik ‘ m gebruik van overmacht in de juridische zin: en.wikipedia.org/wiki/Act_of_God Ze worden als willekeurig beschouwd omdat ze kennelijk niet door de mens kunnen worden gecontroleerd.
- In wezen is er dus niets dat willekeurig is. Maar daarvoor zou elke schijnbaar willekeurige gebeurtenis moeten worden beïnvloed, wat niet ‘ niet werkt als je aan het begin van de tijd komt … Het lijkt erop dat ik ‘ Ik ga enkele filosofielessen volgen = D
- @Korvin, voor zover we weten, zijn kwantumfenomenen zoals radioactief verval of de emissie van een foton door een opgewonden atoom echt willekeurig . Wiskundigen en filosofen debatteren echter wat het betekent om echt willekeurig te zijn. En hoewel gewone mensen denken dat een toss vrij willekeurig is, kunnen agile stage-goochelaars ( news.stanford.edu/pr/2004/diaconis-69.html ) regelmatig krijg 10 koppen bij 10 saltos.
- @Charles – Een toss is niet ‘ zelfs geen binaire kop / munt, het is ‘ s eigenlijk heads / tails / edge, dus een echt goede podiumgoochelaar kan ervoor zorgen dat het kop noch staart naar beneden komt. * 8 ‘)
Antwoord
Ze zijn meestal niet echt willekeurig, maar worden pseudo-willekeurig genoemd omdat ze een getallenreeks genereren die willekeurig lijkt. Dit wordt gedaan met een aantal interessante wiskundige formules. Een van de meest voorkomende is de Lineair congruent Generator .
Pseudo-willekeurige getallen hebben één nuttige eigenschap die echte willekeurige getallen niet hebben: als je dezelfde seed gebruikt wanneer je begint, krijg je een identieke reeks terug. Dit kan erg handig zijn om te testen.
Reacties
- Als ik ‘ je tweede uitspraak correct begrijp:
random(5332)
zal altijd gelijk zijn aanrandom(5332)
? - @Korvin, nee ik bedoel als je
srand(5332)
dan zal het volgende getal dat wordt geretourneerd doorrand
altijd hetzelfde zijn. - ” verschijnt willekeurig ” – > hebben dezelfde statistische eigenschappen als echt willekeurige getallen.
- +1 voor de LGC Wikipedia-link, dit heeft een uitstekende animatie van waarom simpele PRNGs ernstige beperkingen hebben bij het uitvoeren van multidimansionele Monte-carlo-simulaties.
Antwoord
Zijn y Vraag je naar Pseudorandom of Random? Anderen antwoordden over pseudorandom, laat me het hebben over Random.
Er waren (zijn?) Echte op hardware gebaseerde Random Number Generators in de verkoop. Ze waren gebaseerd op een chip met een kleine radio die witte ruis van verre ruimtestraling meet, of een klein radioactief monster en meetperioden tussen het verval ervan. Het probleem met hen was de bandbreedte – de hoeveelheid entropie die ze konden genereren was niet erg hoog, dus werden ze gebruikt voor zaden van pseudo-willekeurige algoritmen. Ze werden gebruikt in banksystemen, hoge beveiliging en dergelijke.
OTOH, als je een ontwikkelaar van embedded systemen tegenkomt, zullen ze hierom lachen. Voor gewone doeleinden bij het programmeren van een microcontroller, zal het lezen van lage 4 bits van elke 16-bits analoog-digitaalomzetter met een zwevende (niet-verbonden) pin een perfect goede willekeurige ruis, bij meer dan voldoende bandbreedte (hoe korter de polling-periode, hoe meer ruis de uitlezing), en gemakkelijker dan het schrijven van daadwerkelijke RNG-routine. En aangezien ADCs vaak worden geïmplementeerd in silicium van microcontrollers, vaak geïmplementeerd en vaak geïmplementeerd met 8 kanalen waarvan je er misschien 5 nodig hebt voor je applicatie, het is praktisch gratis.
En zelfs als je geen ADC hebt, zullen een paar elementen die zijn aangesloten op een digitale GPIO-pin een behoorlijk goede ruis In embedded is ruis ev er-present (en constant gevochten), en daarom is het verkrijgen van enige echte willekeur erg gemakkelijk.
Antwoord
Er zijn veel manieren om te proberen een “willekeurige” reeks getallen te emuleren. Je eerste stop zou moeten zijn om zeker te lezen over lineaire congruentiële generatoren . Dit is hoe de meeste standaard generatoren voor willekeurige getallen werken, en ik durf te wedden dat het zo is hoe de rand () -functie van PHP werkt.
De interessantere volgende vraag om over na te denken is hoe het zichzelf zaait? ? IP-adres? Etc.
Reacties
- Het zaad is wat me in de war brengt, ik kan ‘ denk niet aan iets dat mogelijk de functie kan seeden zonder een bepaald patroon, en zelfs als dat niet het geval is, wat is dan de oorzaak dat de willekeurige seed in de eerste plaats wordt gegenereerd!
- Ik denk dat een tijdstempel vaak gebruikt als een eerste seed wanneer er geen daadwerkelijk wordt geleverd door een andere bron. In het oude BASIC was
RANDOMIZE TIMER
een algemeen idioom, en ” goed voldoende ” voor de meeste (niet-cryptografische) doeleinden. Volgens man 3 srand gebruikt de GNU C-bibliotheek een vaste seed van 1 totdat de PRNG opnieuw is ingezaaid.
Antwoord
Allereerst vrijwel alle rand()
functies bieden geen echte willekeur, maar bieden zogenaamde pseudo-willekeurige getallen.
Dus, hoe werken pseudo-willekeurige nummergeneratoren? In wezen op dezelfde manier als versleuteling werkt: je hebt een functie (een hash) die wat input vergt, en wat output produceert op zon complexe manier dat het onmogelijk is om de input te raden vanuit de output of vice versa. Dat wil zeggen, elke codering kan worden gebruikt om een redelijk goede pseudo-willekeurige generator te maken. Hoewel je in principe elke pseudo-willekeurige generator zou kunnen gebruiken om te coderen, zijn de meeste pseudo-willekeurige nummergeneratoren primair ontwikkeld voor snelheid, niet voor cryptografische beveiliging, dus zal hackers geen hoofdpijn bezorgen.
Voor een pseudo-willekeurige generator wordt de hashing-functie toegepast op een verborgen interne toestand van de generator, en de uitvoer wordt gebruikt om a) die interne toestand te wijzigen, en b) om de uitvoer van de functie rand()
te berekenen. De volgende aanroep van rand()
zal die gewijzigde interne status gebruiken en dus een ander resultaat opleveren. Hoe beter de hash-functie, hoe minder gemakkelijk de resultaten te onderscheiden zijn van echte willekeurige getallen.
In feite hebben computers tegenwoordig toegang tot echte willekeurige getallen: ze komen voort uit jitter in de timing van interrupts geproduceerd door externe apparaten. Linux gebruikt deze waarden van kleine onzekerheid om constant een “entropiepool” in beweging te brengen, die slechts een paar kilobytes interne toestand is. Cryptografische hashes op basis van deze entropiepool worden beschikbaar gesteld via de apparaten /dev/random
en /dev/urandom
. Dus toegang tot een aantal echt heel goede willekeurige getallen is net zo eenvoudig als het openen van een van deze twee apparaten en het lezen van enkele bytes ervan.
Answer
Willekeurige getallen zijn getallen die worden gegenereerd door het proces waarvan de uitvoer onvoorspelbaar is. d.w.z. we kunnen niet zeggen wat de volgende output zal zijn. We kunnen een eenvoudig voorbeeld van de uitkomst van de dobbelstenen nemen. Wat er wordt uitgevoerd als we een dobbelsteen gooien, is onvoorspelbaar.
Er zijn twee soorten willekeurige getallen 1. Echte willekeurige getallen 2. Pseudo-willekeurige getallen.
Hoe willekeurige getallen worden gegenereerd
Opmerkingen
- Gebruik de opmaak van citaten om aan te geven welke delen van de antwoord is van jou en die zijn afkomstig van de bron die je citeert. Als al je antwoord een kopie / plak van een externe bron is, ‘ is hier geen goed antwoord.
- Dit is niet ‘ t lijkt iets wezenlijks te bieden over de punten die zijn gemaakt en uitgelegd in eerdere 6 antwoorden
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }