Od 6 lat mam na swojej stronie generator liczb losowych . Przez długi czas był to pierwszy lub drugi wynik w Google dla „generatora liczb losowych” i był używany do decydowania o dziesiątkach, jeśli nie setkach konkursów i rysunków na forach dyskusyjnych i blogach (wiem, bo widzę odnośniki w moim dzienniki internetowe i zwykle zajrzyj).
Dzisiaj ktoś wysłał mi e-maila z informacją, że może nie być tak przypadkowe, jak myślałem. Próbowała wygenerować bardzo duże liczby losowe (np. Od 1 do 10000000000000000000) i odkryła, że są one prawie zawsze taką samą liczbą cyfr. Rzeczywiście, zawinąłem funkcję w pętlę, dzięki czemu mogłem wygenerować tysiące liczb i oczywiście, dla bardzo dużych liczb, zmienność wynosiła tylko około 2 rzędów wielkości.
Czemu?
Oto wersja zapętlona, więc możesz ją wypróbować:
http://andrew.hedges.name/experiments/random/randomness.html
Zawiera zarówno prostą implementację zaczerpniętą z sieci Mozilla Developer Network, jak i kod z 1997 roku, który usunąłem ze strony internetowej, która już nie istnieje („Central Randomizer 1.3” Paula Houle'a). Wyświetl źródło, aby zobaczyć, jak działa każda metoda.
Czytałem tutaj i gdzie indziej o Mersenne Twister. Interesuje mnie to, dlaczego nie byłoby większych odchyleń w wynikach z wbudowanej funkcji Math.random JavaScript . Dzięki!
źródło
Odpowiedzi:
Podano liczby od 1 do 100.
Podano liczby od 1 do 1000.
i tak dalej.
Jeśli więc wybierzesz jakieś losowo, to ogromna większość wybranych liczb będzie miała taką samą liczbę cyfr, ponieważ zdecydowana większość możliwych wartości ma tę samą liczbę cyfr.
źródło
Twoje wyniki są rzeczywiście oczekiwane. Jeśli liczby losowe są równomiernie rozłożone w zakresie od 1 do 10 ^ n, to można oczekiwać, że około 9/10 liczb będzie miało n cyfr, a kolejne 9/100 będzie miało n-1 cyfr.
źródło
Istnieją różne rodzaje losowości. Math.random podaje jednolity rozkład liczb.
Jeśli chcesz różnych rzędów wielkości, sugerowałbym użycie funkcji wykładniczej do utworzenia tak zwanego rozkładu prawa potęgowego :
Ta funkcja powinna dać mniej więcej taką samą liczbę liczb 1-cyfrowych, co liczb 2-cyfrowych i 3-cyfrowych.
Istnieją również inne rozkłady liczb losowych, takie jak rozkład normalny (zwany również rozkładem Gaussa).
źródło
minimum = 1
imaximum = 10
i czasami otrzymuję w wyniku 11. Prawdopodobnie miałeś zamiar użyćMath.floor
zamiastMath.round
Dla mnie wygląda to zupełnie przypadkowo! (Wskazówka: zależy to od przeglądarki).
Osobiście uważam, że moja implementacja byłaby lepsza, chociaż ukradłem ją z XKCD , za którą ZAWSZE należy przyznać:
źródło
Poniższy artykuł wyjaśnia, w jaki sposób math.random () w głównych przeglądarkach internetowych jest (nie) bezpieczny: „Tymczasowe śledzenie użytkowników w głównych przeglądarkach oraz wyciek informacji między domenami i ataki” autorstwa Amida Kleina (2008) . Nie jest silniejszy niż typowe funkcje PRNG wbudowane w Javę lub Windows.
Z drugiej strony implementacja SFMT okresu 2 ^ 19937-1 wymaga 2496 bajtów stanu wewnętrznego utrzymywanego dla każdej sekwencji PRNG. Niektórzy ludzie mogą uznać to za niewybaczalny koszt.
źródło
Jeśli używasz liczby takiej jak 10000000000000000000, wykraczasz poza dokładność typu danych używanego przez JavaScript. Zwróć uwagę, że wszystkie wygenerowane liczby kończą się na „00”.
źródło
Wypróbowałem generator liczb pseudolosowych JS na Chaos Game .
Mój trójkąt Sierpińskiego mówi, że jest dość przypadkowy:
źródło
Cóż, jeśli generujesz liczby do, powiedzmy, 1e6, miejmy nadzieję, że otrzymasz wszystkie liczby z mniej więcej równym prawdopodobieństwem. Oznacza to również, że masz tylko jedną na dziesięć szans na uzyskanie liczby z jedną cyfrą mniej. Jedna na sto szans na uzyskanie dwóch cyfr mniej itd. Wątpię, czy zauważysz dużą różnicę, używając innego RNG, ponieważ masz równomierny rozkład liczb, a nie ich logarytm.
źródło
Liczby nielosowe równomiernie rozłożone od 1 do N mają tę samą właściwość. Zauważ, że (w pewnym sensie) jest to kwestia precyzji. Jednolity rozkład na 0-99 (jako liczby całkowite) ma 90% swoich liczb posiadających dwie cyfry. Jednolity rozkład na 0-999999 ma 905 swoich numerów posiadających pięć cyfr.
Każdy zbiór liczb (w pewnych niezbyt restrykcyjnych warunkach) ma gęstość. Kiedy ktoś chce omówić liczby „losowe”, należy określić gęstość tych liczb (jak wspomniano powyżej). Powszechną gęstością jest gęstość jednorodna. Są też inne: gęstość wykładnicza, gęstość normalna itp. Przed zaproponowaniem generatora liczb losowych należy wybrać, która gęstość jest odpowiednia. Ponadto liczby pochodzące z jednej gęstości można często łatwo przekształcić w inną gęstość za pomocą środków próchnicowych.
źródło