Właśnie zastanawiałem się nad funkcją php rand()
i zastanawiałem się, jak mogę go przerobić, i doszedłem kompletnie oszołomiony.
Jak działają generatory liczb losowych?
Komentarze
Odpowiedź
Generatory liczb losowych (RNG) tak naprawdę generują liczby pseudolosowe, ponieważ nie jest możliwe wygenerowanie PRAWDZIWNIE losowej liczby. Jedynymi naprawdę losowymi rzeczami są działania Bóg, jak błyskawica.
Ten artykuł na Wikipedii może ci pomóc w wyjaśnieniu: http://en.wikipedia.org/wiki/Random_number_generators
Z tego, co rozumiem, istnieją zasadniczo dwie części RNG: ziarno, a następnie losowa liczba wybrana z tego ziarna. Kiedy zasiewasz RNG, dajesz jest to odpowiednik początkowego pliku po int. Ten punkt początkowy ma wtedy zbiór liczb, które są „wewnątrz” tego punktu, z których program wybiera. W PHP możesz użyć srand () do „shuffle” nasion, więc prawie zawsze otrzymasz inną odpowiedź. Następnie możesz użyć rand (min, max), aby przejść do nasionka i wybrać liczbę między min a max włącznie.
OSTRZEŻENIE, MOŻLIWA ANALOGIA SERÓW!
Pomyśl o każdym „ziarnie” jak o skrzyni z lodem, a następnie o losowych liczbach jako o kostkach lodu. Powiedzmy, że masz 1000 skrzynek z lodem, a każda skrzynia zawiera 1000 kostek lodu. Na jarmarku okręgowym wybiorą skrzynię z lodem, której zaczną używać do napojów, i mogą użyć tylko jednej kostki lodu. Jednak potrzebują tylko kostek lodu większych niż 1 cal sześcienny. Więc wybiorą losowo skrzynię spośród tych 1000 skrzyń, a następnie wybiorą losowo kostkę lodu w tej skrzyni. Jeśli działa w pożądanym przez nich rozmiarze, używają go. Jeśli tak nie jest, wkładają go z powrotem do skrzyni razem z innymi. Jeśli chcą, aby było trochę fajniej, wcześniej zmieniają skrzynie, aby całkowicie nieświadomie, jeśli chcesz!
A jeśli chodzi o PHP właściwie fizycznie wybiera ziarno i liczbę losową, nie mam na to wystarczającej wiedzy (i prawdopodobnie nad tym się zastanawiałeś najbardziej!). Nie próbowałbym przerobić funkcji rand (); dla większości aplikacji internetowych, które stworzysz, rand () powinno wystarczyć dla dowolnej liczby losowej, której będziesz potrzebować.
Sprawdź także liniową przystającą generatory, to może być więcej tego, czego „szukasz, jeśli chcesz poznać brudne szczegóły: http://en.wikipedia.org/wiki/Linear_congruential_generator
Mam nadzieję, że to pomoże!
Komentarze
- W jaki sposób działania
god
byłyby losowe w najmniejszym stopniu? Co więcej, błyskawica nie jest ' t przypadkowa, podąża ścieżką określoną przez różne warunki. Ponadto tłumacz generujący numer jest zasadniczo nieistotny. - Ja ' używam aktów Bożych w sensie prawnym: en.wikipedia.org/wiki/Act_of_God Są uważane za przypadkowe, ponieważ są poza pozorną kontrolą człowieka.
- Zasadniczo nie ma nic losowego. Ale to wymagałoby wpływu na każde pozornie przypadkowe wystąpienie, co nie ' nie działa, gdy dotrzesz do samego początku … Wygląda na to, że ' mam zamiar wziąć kilka zajęć z filozofii = D
- @Korvin, o ile wiemy, zjawiska kwantowe, takie jak rozpad radioaktywny lub emisja fotonu przez wzbudzony atom, są naprawdę przypadkowe . Jednak matematycy i filozofowie spierają się, co to znaczy być naprawdę przypadkowym. I chociaż zwykli ludzie uważają, że rzut monetą jest dość przypadkowy, zwinni magicy sceniczni ( news.stanford.edu/pr/2004/diaconis-69.html ) mogą regularnie zdobądź 10 orłów w 10 rzutach.
- @Charles – Rzut monetą nie jest ' t nawet binarnym orłem / reszką, to ' tak naprawdę jest orzeł / reszka / krawędź, więc naprawdę dobry mag sceniczny może sprawić, że spadnie ani orzeł, ani reszka. * 8 ')
Odpowiedź
Zwykle są nie są naprawdę losowe, ale nazywane są pseudolosowymi, ponieważ generują ciąg liczb, który wydaje się losowy. Robi się to za pomocą kilku interesujących wzorów matematycznych. Jednym z najczęstszych jest Generator .
Liczby pseudolosowe mają jedną przydatną właściwość, której nie mają prawdziwe liczby losowe: jeśli użyjesz tego samego ziarna na początku, otrzymasz identyczną sekwencję. Może to być bardzo przydatne do testowania.
Komentarze
- Jeśli ' rozumiem poprawnie Twoje drugie stwierdzenie:
random(5332)
zawsze będzie równerandom(5332)
? - @Korvin, nie mam na myśli, jeśli zadzwonisz pod numer
srand(5332)
wtedy następna liczba zwrócona przezrand
będzie zawsze taka sama. - ” pojawia się losowo ” – > ma takie same właściwości statystyczne jak prawdziwie losowe liczby.
- +1 dla linku LGC do Wikipedii, ma to doskonałe animacja , dlaczego proste PRNG mają poważne ograniczenia podczas wykonywania wielowymiarowych symulacji Monte-Carlo.
Odpowiedź
Czy y czy pytasz o Pseudorandom lub Random? Inni odpowiadali na temat pseudolosowości, pozwólcie, że opowiem o Random.
W sprzedaży były (są?) Rzeczywiste sprzętowe generatory liczb losowych. Były oparte na chipie z małym radiem mierzącym biały szum promieniowania kosmicznego lub małą próbką radioaktywną i mierzącymi okresy między jego rozpadem. Problem z nimi polegał na przepustowości – ilość entropii, jaką mogli wygenerować, nie była zbyt duża, więc zostały użyte jako zalążki algorytmów pseudolosowych. Były używane w systemach bankowych, wysokim bezpieczeństwie i tym podobnych.
OTOH, jeśli spotkasz jakiegoś programistę systemów wbudowanych, będą się z tego śmiać. Do typowych celów programowania mikrokontrolera, odczyt 4 niskich bitów dowolnego 16-bitowego przetwornika analogowo-cyfrowego z pływającym (niepołączonym) pinem da losowy szum przy większej niż wystarczającej przepustowości (im krótszy okres odpytywania, tym bardziej „zaszumiony” odczyt) i łatwiejszy niż pisanie rzeczywistej procedury RNG. A biorąc pod uwagę, że przetworniki ADC są powszechnie stosowane w krzemie mikrokontrolerów, powszechnie wdrażane i często wdrażane z 8 kanałów, z których potrzebujesz może 5 dla swojej aplikacji, jest praktycznie darmowe.
A nawet jeśli nie masz ADC, kilka elementów podłączonych do cyfrowego pinezki GPIO da całkiem niezłe szum W osadzonych szum jest ev er-present (i ciągle walczy), więc uzyskanie prawdziwej losowości jest bardzo łatwe.
Odpowiedź
Jest wiele sposobów próbować naśladować „losową” sekwencję liczb. Pierwszym przystankiem powinno być na pewno przeczytanie o liniowych generatorach kongruencjalnych . Tak działa większość podstawowych generatorów liczb losowych. Założę się, że tak działa funkcja rand () w PHP.
Kolejnym ciekawszym pytaniem do rozważenia jest to, w jaki sposób sam się tworzy? ? Adres IP? Itd.
Komentarze
- Zarodek jest tym, co mnie wprawia w zakłopotanie, mogę ' nie myśl o niczym, co mogłoby zasiać funkcję bez jakiegoś wzorca, a nawet jeśli nie, to co powoduje generowanie losowego ziarna!
- Uważam, że znacznik czasu jest często używane jako początkowe ziarno, gdy żadne z nich nie pochodzi z innego źródła. W starym języku BASIC
RANDOMIZE TIMER
był powszechnym idiomem, a ” dobrze ” do większości (niekryptograficznych) celów. Według man 3 srand , biblioteka GNU C używa naprawiono liczbę 1 do momentu ponownego obsadzenia PRNG.
Odpowiedź
Po pierwsze, praktycznie wszystko rand()
funkcje nie zapewniają prawdziwej losowości, a raczej tak zwane liczby pseudolosowe.
Jak więc działają generatory liczb pseudolosowych? Zasadniczo w ten sam sposób, w jaki działa szyfrowanie: masz funkcję (skrót), która pobiera pewne dane wejściowe i generuje dane wyjściowe w tak złożony sposób, że na podstawie danych wyjściowych nie można odgadnąć danych wejściowych lub odwrotnie. każdy szyfr może być użyty do stworzenia raczej dobrego generatora pseudolosowego. Jednakże, chociaż w zasadzie można użyć dowolnego generatora pseudolosowego do szyfrowania, większość generatorów liczb pseudolosowych jest opracowanych głównie z myślą o szybkości, a nie bezpieczeństwie kryptograficznym, nie sprawi hakerom żadnych problemów.
W przypadku generatora pseudolosowego funkcja haszująca jest stosowana do jakiegoś ukrytego stanu wewnętrznego generatora, a jej wyjście służy do a) modyfikowania tego stanu wewnętrznego oraz b) do obliczenia wyniku działania funkcji rand()
. Następne wywołanie rand()
wykorzysta ten zmieniony stan wewnętrzny, a tym samym da inny wynik. Im lepsza funkcja skrótu, tym trudniej wyniki można odróżnić od prawdziwych liczb losowych.
W rzeczywistości komputery mają obecnie dostęp do rzeczywistych liczb losowych: wynikają one z jittera w taktowaniu przerwań wytwarzanych przez urządzenia zewnętrzne. Linux używa tych wartości małej niepewności do ciągłego mieszania „puli entropii”, która jest zaledwie kilkoma kilobajtami stanu wewnętrznego. Kryptograficzne skróty oparte na tej puli entropii są udostępniane za pośrednictwem urządzeń /dev/random
i /dev/urandom
. Zatem dostęp do naprawdę dobrych liczb losowych jest tak prosty, jak otwarcie jednego z tych dwóch urządzeń i odczytanie z nich kilku bajtów.
Odpowiedź
Liczby losowe to liczby generowane przez proces, których wynik jest nieprzewidywalny. tj. nie możemy powiedzieć, co będzie następnym wynikiem. Możemy wziąć prosty przykład wynik kości. To, co pojawi się, gdy rzucimy kostką, jest nieprzewidywalne.
Istnieją dwa rodzaje liczb losowych 1. Prawdziwe liczby losowe 2. Liczby pseudolosowe.
W jaki sposób generowane są liczby losowe
Komentarze
- Użyj formatowania cytatów, aby podkreślić, które części odpowiedź jest twoja i która pochodzi ze źródła, które cytujesz. Jeśli cała Twoja odpowiedź to kopiowanie / wklejanie z zewnętrznego źródła, to ' nie jest tutaj dobrą odpowiedzią.
- to nie ' nie wydaje się oferować niczego istotnego w stosunku do punktów przedstawionych i wyjaśnionych w poprzednich 6 odpowiedziach
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }