Éppen a php rand()
funkción töprengtem, és azon gondolkodtam, hogyan tudnám átdolgozni, és eljöttem teljesen elkábult.
Hogyan működnek a véletlenszám-generátorok?
Megjegyzések
Válasz
A véletlenszám-generátorok (RNG-k) valóban álvéletlenszerű számokat generálnak, mivel valójában VALÓSAN véletlenszámot nem lehet létrehozni. Az igazán igazán véletlenszerű dolgok csak Istenem, mint a villám.
Ez a wikipédia-cikk segíthet a magyarázatban: http://en.wikipedia.org/wiki/Random_number_generators
Megértésem szerint az RNG-nek alapvetően két része van: a mag, majd az abból kiválasztott véletlenszám. Amikor az RNG-t kiveted, megadod egy kezdő po-val egyenértékű int. Ennek a kiindulópontnak akkor van egy csomó száma, amely “benne” van, és amelyek közül a program választ. A PHP-ben az srand () használatával “keverheted” a magokat, így szinte mindig más választ kapsz. Ezután a rand (min, max) segítségével bejuthat a magba, és kiválaszthat egy számot a min és a max között, beleértve.
FIGYELMEZTETÉS, LEHETSÉGES SAJT-ANALÓGIA ELŐTT!
Gondolj minden egyes „magra” mint jégládára, majd a véletlenszerű számokra mint jégkockákra. Tegyük fel, hogy 1000 jégládája van, és mindegyik ládájában 1000 jégkocka van. A megyei vásáron egy jégkamrát választanak, amelyet italokhoz használni kezdenek, és csak egy jégkockát használhatnak. Nekik azonban csak 1 köbcentiméternél nagyobb jégkockákra van szükségük. Tehát véletlenszerűen választanak egy ládát az 1000 láda között, majd véletlenszerűen kiválasztanak egy jégkockát a mellkas belsejében. Ha a kívánt méretre működik, akkor használják. Ha nem, akkor visszateszik a mellkasába a többiekkel. Ha egy kicsit szórakoztatóbbá akarják tenni, előzetesen mellkasot cserélnek a teljes feledékenység érdekében, ha akarod!
Ami a PHP működését illeti. valójában fizikailag választja ki a magot és a véletlen számot, ehhez nincs elég tudásom (valószínűleg erre gondoltatok a legjobban!). Nem próbálom megismételni a rand () függvényt; a legtöbb elkészített webalapú alkalmazás esetén a rand () elegendő minden véletlenszerű számhoz.
Nézze meg a lineáris kongruenciát is generátorok, ez lehet inkább az, amit keres, ha piszkos részleteket szeretne: http://en.wikipedia.org/wiki/Linear_congruential_generator
Remélem, hogy ez segít!
Megjegyzések
- Hogyan lennének véletlenszerűek a
god
cselekedetei a legkevésbé sem? Ráadásul a villám sem véletlenszerűen véletlenszerű, a különböző körülmények által meghatározott utat követi. Emellett a számot előállító tolmács lényegében lényegtelen. - I ‘ m jogi értelemben vett Isten cselekedeteit használom: hu.wikipedia.org/wiki/Act_of_God Véletlenszerűnek számítanak, mivel nyilvánvaló emberi kontrollon kívül esnek.
- Tehát lényegében semmi sem véletlenszerű. Ehhez azonban minden látszólag véletlenszerű esemény befolyásolására van szükség, ami ‘ nem működik, ha az idők legelején eléred …. Úgy tűnik, I ‘ Néhány filozófiaórát fogok venni = D
- @ Korvin, amennyire tudjuk, olyan kvantumjelenségek, mint a radioaktív bomlás, vagy egy gerjesztett atom által kibocsátott foton valóban véletlenszerűek . A matematikusok és a filozófusok azonban azt állítják, mit jelent az, hogy valóban véletlenszerűek vagyunk. És bár a hétköznapi emberek azt gondolják, hogy az érme dobása meglehetősen véletlenszerű, az agilis színpadi mágusok ( news.stanford.edu/pr/2004/diaconis-69.html ) rendszeresen tudnak szerezzen 10 fejet 10 lapon.
- @Charles – Egy érme dobása nem ‘ még bináris fejeket / farkakat sem, ez ‘ nek valójában feje / farka / éle, így egy nagyon jó színpadi mágus elérheti, hogy se fej, se farok ne jöjjön le. * 8 ‘)
Válasz
Ők általában nem igazán véletlenszerű, hanem ál-véletlenszerűnek hívják őket, mert véletlenszerűnek tűnő számszekvenciát generálnak. Ez néhány érdekes matematikai képlettel történik. Az egyik leggyakoribb a lineáris kongruenciális Generátor .
Az ál-véletlenszerű számoknak van egy hasznos tulajdonsága, amelyet az igaz véletlenszerű számok nem tesznek: ha ugyanazt a magot használod induláskor, akkor azonos sorrendet kapsz vissza. Ez nagyon hasznos lehet a teszteléshez.
Megjegyzések
- Ha ‘ jól értem a második állítást:
random(5332)
mindig egyenlő lesz a következővel:random(5332)
? - @Korvin, nem, nem úgy értem, ha a következőt hívja:
srand(5332)
akkor a következő szám, amelyetrand
ad vissza, mindig ugyanaz lesz. - ” véletlenszerűen jelenik meg ” – > statisztikai tulajdonságai megegyeznek a valóban véletlenszerű számokkal.
- +1 az LGC Wikipedia linknél, ennek kiváló animáció arról, hogy az egyszerű PRNG-knek miért vannak komoly korlátai a többdimenziós Monte-carlo szimulációk során.
Válasz
Vagyok kérsz álvéletlen vagy véletlenszerűt? Mások álvéletlenszerűségről válaszoltak, hadd beszéljek a Randomról.
Voltak (vannak?) Tényleges hardver alapú véletlenszám-generátorok. Ezek egy chipen alapultak, amelyen egy kis rádió mérte a mélyűr sugárzásának fehér zaját, vagy egy kis radioaktív minta, és a bomlása közötti időszakokat mértük. A problémát a sávszélesség okozta – az általuk előállított entrópia mennyisége nem volt túl magas, így ál-véletlenszerű algoritmusok magjaihoz használták. Banki rendszerekben, nagy biztonságban és hasonlókban használták őket.
OTOH, ha találkozik bármely beágyazott rendszer fejlesztővel, akkor ezek nevetni fognak. A mikrovezérlő programozásának általános célja, hogy bármely 16 bites analóg-digitális átalakító alacsony 4 bitjének olvasása lebegő (nem csatlakoztatott) tűvel tökéletesen jó véletlenszerű zaj, több mint elegendő sávszélesség mellett (minél rövidebb a szavazási periódus, annál “zajosabb” a kiolvasás), és könnyebb, mint a tényleges RNG rutin megírása. És ha figyelembe vesszük, hogy az ADC-k általában megtalálhatók a mikrovezérlők szilíciumában, ezeket általában megvalósítják és gyakran 8 csatorna, amelyből talán 5 szükséges az alkalmazásához, gyakorlatilag ingyenes.
És még ha nincs is ADC-je, néhány digitális GPIO-csatlakozóhoz csatlakoztatott elem nagyon jó Beágyazottban a zaj ev van-jelen (és állandóan küzdött), és így valódi véletlenszerűség megszerzése nagyon egyszerű.
Válasz
Sokféleképpen lehet hogy megpróbálja “véletlenszerű” számsorozatot utánozni. Első lépésként el kell olvasnia a lineáris kongruenciális generátorokat , az biztos. Így működnek a legtöbb alapvető véletlenszám-generátor, és arra tippelnék, hogy a PHP rand () függvénye hogyan működik.
A következő érdekes kérdés, hogy elgondolkodhatunk, hogy hogyan kezeli magát? ? IP-cím? Stb.
Megjegyzések
- A vetőmag az, ami megzavar, tudok ‘ ne gondolj bármi olyanra, ami valamilyen minta nélkül képes beágyazni a függvényt, és ha nem is, akkor mi okozza elsősorban a véletlenszerű mag létrehozását!
- Úgy gondolom, hogy az időbélyeg gyakran szerepel akkor használatos kezdeti magként, ha egyiket sem adják meg más forrásból. A régi BASIC-ban a
RANDOMIZE TIMER
gyakori kifejezés volt, és ” jó elegendő ” a legtöbb (nem kriptográfiai) célhoz. A man 3 srand szerint a GNU C könyvtár egy fix magja 1-ig, amíg a PRNG-t újra nem vetik.
Válasz
Először is, gyakorlatilag az összes rand()
függvények nem nyújtanak valódi véletlenszerűséget, inkább úgynevezett ál-véletlenszerű számokat adnak meg.
Tehát hogyan működnek az ál-véletlenszerű számgenerátorok? Alapvetően ugyanúgy, ahogy a titkosítás is működik: Van egy funkciója (hash), amely bizonyos összetevőket vesz be, és valamilyen kimenetet olyan összetett módon állít elő, hogy a kimenetből lehetetlen kitalálni a bemenetet, vagy fordítva. Minden cypher felhasználható meglehetősen jó ál-véletlen generátor létrehozására. Bár a titkosításhoz elvileg bármilyen ál-véletlen generátort is használhatna, a legtöbb ál-véletlenszerű szám-generátort elsősorban a sebesség, nem pedig a kriptográfiai biztonság érdekében fejlesztették ki, tehát nem okoz fejfájást a hackereknek.
Egy ál-véletlen generátor esetében a kivonatolási funkciót a generátor valamilyen rejtett belső állapotára alkalmazzák, és annak kimenetét arra használják, hogy a) módosítsák ezt a belső állapotot, és b) a rand()
függvény kimenetének kiszámításához. A rand()
következő meghívása a megváltozott belső állapotot használja, és így más eredményt fog eredményezni. Minél jobb a hash függvény, annál kevésbé könnyedén megkülönböztethetők az eredmények a valódi véletlenszámoktól.
Ami azt illeti, manapság a számítógépek valódi véletlenszerű számokhoz férnek hozzá: Ezek a külső eszközök által létrehozott megszakítások időzítéséből fakadnak. A Linux ezeket az apró bizonytalansági értékeket arra használja, hogy folyamatosan felkavarja az “entrópiakészletet”, amely csak néhány kilobájt belső állapot. Az ezen entrópiakészleten alapuló kriptográfiai kivonatok a /dev/random
és /dev/urandom
eszközökön keresztül állnak rendelkezésre. Tehát az igazán jó véletlenszerű számokhoz való hozzáférés olyan egyszerű, mint megnyitni e két eszköz egyikét, és olvasni belőlük néhány bájtot.
Válasz
A véletlenszerű számok a folyamat által generált számok, amelyek kimenete kiszámíthatatlan. vagyis nem tudjuk megmondani, mi lesz a következő kimenet. Vegyünk néhány egyszerű példát a kocka eredményére. Az kiszámíthatatlan, hogy mi kerül kimenetre, ha dobunk egy kockát.
Kétféle véletlenszerű szám létezik. Igaz véletlen számok 2. Ál véletlenszerű számok.
A véletlenszerű számok generálása
Megjegyzések
- Az idézet formázásával jelölje ki a a válasz a tiéd, és amelyek az általad idézett forrásból származnak. Ha minden válasza egy külső forrásból származó másolás / beillesztés, akkor ‘ itt nem jó válasz.
- ez nem semmi lényegeset nem kínál az előző 6 válaszban kifejtett és kifejtett pontok felett
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }