Dlaczego Zwykły Algorytm Math.random() w Przeglądarce Jest Błędny dla Poważnych Losowań?
Większość witryn oferujących generatory liczb wykorzystuje prostą linijkę kodu w języku JavaScript: Math.floor(Math.random() * (max - min + 1)) + min. Chociaż jest to rozwiązanie szybkie dla programisty, w kontekście teorii prawdopodobieństwa i bezpieczeństwa niesie za sobą poważne wady:
- Determinizm Ziarna: Algorytm
Math.random()jest generatorem pseudolosowym (PRNG). Jeśli atakujący lub obserwator pozna wewnętrzny stan silnika (zazwyczaj 128 bitów w V8), jest w stanie z wyprzedzeniem przewidzieć kolejne tysiące wylosowanych liczb. - Brak Certyfikacji Kryptograficznej: Standard ECMAScript wyraźnie zastrzega, że funkcja ta nie może być stosowana w systemach loteryjnych, kryptografii ani w aplikacjach wymagających niezawodnej bezstronności.
Problem Zniekształcenia Modularnego (Modulo Bias) i Jego Eliminacja
Drugim krytycznym błędem popełnianym przez amatorskie narzędzia jest tzw. Modulo Bias. Wyobraźmy sobie generator losujący liczby od 0 do 255 (1 bajt), z którego chcemy wylosować liczbę od 1 do 10 (10 możliwych stanów). Liczba 256 nie dzieli się bez reszty przez 10 (256 = 25 × 10 + 6). W efekcie liczby od 0 do 5 pojawią się 26 razy, podczas gdy liczby od 6 do 9 pojawią się tylko 25 razy! Daje to mniejszym liczbom nieuczciwą, 4-procentową przewagę.
Limit = 2³² - (2³² mod Zakres) Jeśli wygenerowana liczba 32-bitowa X ≥ Limit, zostaje bezwzględnie odrzucona i próbkowana ponownie z jądra systemu operacyjnego.
Typowe Zastosowania Maszyny Losującej Liczby
Dzięki możliwości elastycznego definiowania zakresu oraz wymuszania unikalności, generator sprawdza się w dziesiątkach scenariuszy:
- Loterie Fantowe i Zbiórki Charytatywne: Błyskawiczne losowanie wygrywających numerów losów od 1 do N z gwarancją braku duplikatów.
- Wybór Szczęśliwego Numerka w Szkole: Nauczyciele mogą w kilka sekund wylosować ucznia zwolnionego z niezapowiedzianej kartkówki.
- Tworzenie Losowych Haseł PIN: Generowanie bezpiecznych, 4-, 6- lub 8-cyfrowych kodów autoryzacyjnych.
- Pomiary Statystyczne i Badania Społeczne: Dobór próby losowej z listy respondentów (Simple Random Sampling).
- RFC 4086: Randomness Requirements for Security — Bezpieczne generatory liczb losowych muszą czerpać entropię z nieprzewidywalnych zjawisk fizycznych i stosować bezstronne metody odwzorowania na przedziały dyskretne. (2005)
- NIST Special Publication 800-22: Statistical Test Suite for Random and Pseudorandom Number Generators — Zestaw 15 rygorystycznych testów statystycznych weryfikuje brak korelacji szeregowej oraz jednorodność bitową w próbkach kryptograficznych. (2010)
Najczęściej Zadawane Pytania o Generator Liczb
Wszystko, co musisz wiedzieć o losowaniach, bezstronności i funkcjach platformy.