Generator Losowych Liczb
Generuj losowe liczby w dowolnym zakresie. Możliwość losowania bez powtórzeń. Bezpłatny kalkulator matematyczny online – natychmiastowe wyniki.
Co to jest generator liczb losowych?
Generator liczb losowych (RNG) to narzędzie lub algorytm, który generuje liczby bez widocznej struktury — każdy wynik jest statystycznie niezależny od poprzednich wyników, z każdą wartością w zakresie równie prawdopodobne. Liczby losowe są podstawą statystyki, gier, kryptografii, symulacji naukowych i programowania komputerowego.
Autentyczna losowość pochodzi z fizycznych zjawisk, które są nieprzewidywalne: rozpad radioaktywny, hałas atmosferyczny, hałas termiczny w obwodach elektronicznych lub zjawiska tunelowania kwantowego. Generatorzy losowości (RNG) pomiarowe mierzą te zjawiska, aby wyprodukować naprawdę losowe strumienie bitowe. Usługi takie jak random.org zbierają hałas atmosferyczny z odbiorników radiowych, aby dostarczyć naprawdę losowe liczby.
Liczby komputerowo generowane są technicznie pseudolosowe — są to sekwencje deterministyczne, które wyglądają losowo, ale są całkowicie zależne od początkowej wartości zwanej nasionem. Podanym nasieniem, pseudolosowy generator liczb (PRNG) generuje dokładnie tę samą sekwencję. Jest to naprawdę przydatne w przypadku reprodukowalności w symulacjach naukowych: ustal nasiono, zapisz je, a możesz później powtórzyć wyniki.
Jak działają pseudolosowe generatory liczb
Nowoczesne PRNG używają algorytmów matematycznych do generowania sekwencji o doskonałych właściwościach statystycznych. Najbardziej rozpowszechniony algorytm to Mersenne Twister (MT19937), opracowany przez Matsumoto i Nishimurę w 1997 roku. Ma okres 2^19937 − 1 (liczbę o prawie 6 000 cyfrach) przed powtórzeniem, przeszła wszystkie standardowe testy statystyczne losowości i jest domyślnym generatorem losowości w Pythonie, PHP, Ruby, R i wielu innych językach.
Nowsze algorytmy to xoshiro/xoroshiro (bardzo szybkie, małe stanu) i PCG (Permuted Congruential Generator) (doskonałe jakości statystyczne z małym stanem). W przypadku zastosowań kryptograficznych te standardowe PRNG są niewystarczające — wymagane są kryptograficznie bezpieczne PRNG (CSPRNG), ponieważ standardowe PRNG mogą być przewidywalne, jeśli atakujący wie wystarczająco dużo wyjść.
Przeglądarki dostarczają dostęp do CSPRNG za pomocą API crypto.getRandomValues(), których używa ten kalkulator do generowania liczb losowych. Jest to znacznie bezpieczniejsze niż Math.random(), która używa prostego PRNG i nie powinna być używana w zastosowaniach związanych z bezpieczeństwem.
| Algorytm | Okres | Prędkość | Kryptograficzny? | Używany w |
|---|---|---|---|---|
| Math.random() | Zależny od implementacji | Very fast | No | Browser JS (nie-krypto) |
| Mersenne Twister | 2^19937 − 1 | Fast | No | Python, R, MATLAB |
| xoshiro256** | 2^256 − 1 | Very fast | No | Rust, .NET, Julia |
| PCG-64 | 2^128 | Fast | No | NumPy, wielu językach |
| ChaCha20 | — | Fast | Yes | Linux /dev/urandom, TLS |
| Fortuna | — | Medium | Yes | macOS, iOS, Windows |
Wspólne zastosowania liczb losowych
Gry i Rozrywka: Rzuty kośćmi, mieszanie kart, proceduralne generowanie poziomów, systemy losowego wyboru nagród, randomizacja zachowania NPC. Cały doświadczenie gier roguelikowych (Nethack, Spelunky, Hades) zależy od wysokiej jakości losowości, która wygląda na sprawiedliwą i nieprzewidywalną.
Loterie i Raffle: Losowe wybory dla nagród, losowe wybory w konkursach, losowe wybory w jury, wybory w drafcie, a także każda sprawiedliwa alokacja ograniczonego zasobu wśród uczestników. Naprawdę losowe wybory zapewniają brak uprzedzeń.
Symulacje Naukowe (Metody Monte Carlo): Liczby losowe napędzają symulacje Monte Carlo, które używają powtarzających się losowych próbek do przybliżenia skomplikowanych wyników matematycznych. Zastosowania obejmują szacowanie π, ceny opcji finansowych, modelowanie reakcji jądrowych, prognozowanie pogody, a także badania interakcji leków.
Statystyka i Badania: Losowe próbkowanie dla ankiet, losowe przydziały w badaniach klinicznych (randomizowane badania kontrolowane), generowanie próbek bootstrapa dla przedziałów ufności, a także weryfikacja krzyżowa w uczeniu maszynowym wymagają liczb losowych.
Kryptografia i Bezpieczeństwo: Generowanie kluczy dla szyfrowania, generowanie tokenów sesji, wyzwania CAPTCHA, jednorazowe hasła (OTP/2FA), wartości soli dla haszowania haseł, a także nonce w protokołach kryptograficznych wymagają wysokiej jakości losowości. Słaba losowość w zastosowaniach kryptograficznych może być katastrofalna — doprowadziła do naprawdę realnych naruszeń bezpieczeństwa.
Programowanie Komputerowe: Generowanie danych testowych, testowanie obciążeniowe, fuzzing (znajdowanie błędów poprzez karmienie losowych wejść do oprogramowania), weryfikacja A/B, losowe przydziały w algorytmach mieszania (jak funkcja "losowego" w Spotify), a także testowanie symulacyjne.
Świadomość i Statystyczne Oczekiwania
Losowa generacja liczby daje każdej wartości w zakresie równą prawdopodobieństwo. Dla zakresu 1–6 (jak kość), każda liczba powinna pojawić się około 1/6 ≈ 16,67% czasu w ciągu wielu rzutów. Ale w krótkich serii, odchylenia są normalne i spodziewane – to właśnie to mówi nam prawdopodobieństwo.
Przepis o Wielkiej Liczbie stwierdza, że zwiększając liczbę prób, obserwowane częstości konvergują do teoretycznych prawdopodobieństw. Rzuć kość 12 razy i możesz zobaczyć {1,3,5,6,2,1,4,3,2,6,5,4} – nie dokładnie 2 razy każda liczba. Rzuć ją 60 000 razy i zobaczysz bardzo blisko 10 000 razy każda liczba. Ta konwergencja jest gwarantowana przez przepis, ale krótkoterminowe wzory nie są.
Upadek zakładnika to błąd, że przypisujemy przeszłe wyniki do przyszłych w niezależnych losowych zdarzeniach. Pobranie 5 głów w rzędzie nie czyni tylu "wymagających". Każdy rzut jest niezależny; moneta nie ma pamięci. Podobnie, losowa generacja liczby, która właśnie wyprodukowała 7, nie jest mniej prawdopodobna do wyprodukowania 7 ponownie w następnym wezwaniu.
| Zakres | Przypadek Prawdopodobieństwa | Oczekiwana Częstość (na 1000) | Typowe Użycie |
|---|---|---|---|
| 1–2 | 50% | 500 | Symulacja rzutu monetą |
| 1–6 | 16,67% | 167 | Symulacja rzutu kością |
| 1–10 | 10% | 100 | Wybór dziesiątki |
| 1–52 | 1,92% | 19 | Karta talii |
| 1–100 | 1% | 10 | Procentyl/ogólne użycie |
| 1–1 000 000 | 0,0001% | 0,001 | Symulacja biletu loteryjnego |
Generowanie Liczb Losowych w Nauce: Metody Monte Carlo
Metody Monte Carlo wykorzystują losowe próby do rozwiązywania problemów, które są trudne lub niemożliwe do rozwiązania analitycznie. Nazwane po kasynie w Monako (z powodu oczywistych powodów), te metody przekształcają trudne problemy deterministyczne w prawdopodobistyczne, rozwiązywalne za pomocą symulacji.
Estymacja π: Losowo generuj punkty w jednostkowej prostokątnej (x,y każdy w [0,1]). Licz, ile z nich leży w jednostkowym kołnierzu (x² + y² ≤ 1). Stosunek to π/4. Z 1 milionem losowych punktów możesz oszacować π do około 3–4 miejsc dziesiętnych. To nie jest efektywny sposób obliczania π, ale pięknie demonstruje siłę losowości.
Modelowanie Finansowe: Ceny opcji Black-Scholesa i obliczenia Value at Risk wykorzystują tysiące możliwych przyszłych ścieżek cen, wykorzystując losowe liczby. Każda ścieżka reprezentuje jedną możliwą przyszłość. Rozkład wyników w milionach symulacji daje rozkład prawdopodobieństwa zwrotów portfela.
Rozwój Leków: Symulacje Monte Carlo modelują interakcje cząsteczek leku, przewidując, jak prawdopodobna jest kandydat do wiązania się z białkiem docelowym. To redukuje liczbę potrzebnych doświadczeń laboratoryjnych, oszczędzając miliardy dolarów w rozwoju farmaceutycznym.
Generowanie Unikalnych Liczb Losowych (Bez Zamiany)
Czasami potrzebujesz losowych liczb, które nie powtarzają się – na przykład, mieszając talicę kart, przydzielając uczestników do grup lub wybierając zwycięzców loterii. To nazywa się wykonywaniem próbek bez zamiany (w przeciwieństwie do wykonywania próbek z zamianą, gdzie ta sama wartość może pojawić się kilkukrotnie).
Standardowy algorytm dla tego jest algorytmem Fisher-Yates (także znany jako Knuth shuffle). Dla tablicy o n elementach: zaczynaj od ostatniego elementu, zamień go z losowo wybranym elementem z całej tablicy (włącznie z samym sobą), potem przejdź do drugiego od końca elementu, zamień go z losowo wybranym elementem z tych pozostałych, i kontynuuj. Wynikiem jest losowa permutacja w czasie O(n).
Aby wygenerować k unikalnych losowych liczb z zakresu [min, max]: utwórz tablicę wszystkich wartości w zakresie, zastosuj Fisher-Yates, weź pierwsze k elementy. To gwarantuje, że każda kombinacja k wartości jest równie prawdopodobna – prawdziwa próbka bez zamiany.
Losowe Liczby w Codziennych Decyzjach
Generatorzy liczb losowych są niezwykle przydatne w praktycznych codziennych decyzjach:
Rozwiązywanie Remisów: Gdy istnieją dwie równie dobre opcje, liczba losowa może zrobić decyzję bez nadmiernego myślenia. Badania sugerują, że gdy ludzie zbyt długo rozważają naprawdę równoważne wybory, wprowadzają skłonności, które sprawiają, że są mniej zadowoleni z wyniku niż gdyby wybrali losowo.
Planowanie i Harmonogramowanie: Losowe harmonogramy gwarantują sprawiedliwość w czasie. Kto wybiera pierwszy w drafcie fantasy, kto otrzymuje preferowaną zmianę, który temat zostaje omówiony pierwszy w spotkaniu — losowa alokacja eliminuje uprzedmiotowienie i wrażenie niesprawiedliwości.
Nauka i Praktyka: Studentów korzystających z kartek do nauki korzysta z losowego układu — zapobiega to uczeniu się "wskazówek kontekstowych" (wiedzy odpowiedzi na kartkę 15, ponieważ odpowiedziałeś na kartkę 14). Losowe mieszanie ćwiczeń jest udowodnioną techniką (praktyka wmiotana) wzmocniającą trwałą retenję w porównaniu z blokadą praktyki.
Źródło Inspiracji: Pisarze, artyści i muzycy używają generatorów słów losowych, generatorów promów i losowych narzędzi ograniczających, aby pokonać bariery kreatywne. Ograniczenia wprowadzane losowo często zmuszają do niezwykłych i interesujących rozwiązań kreatywnych.
Często zadawane pytania
Czy ten generator jest naprawdę losowy?
Używa on API crypto.getRandomValues() Twojej przeglądarki, który jest bezpiecznym pseudolosowym generatorem liczb (CSPRNG). Dla gier, decyzji, statystyk i losowań, jest to nieodróżnialne od prawdziwej losowości. W przypadku absolutnej prawdziwej losowości (zjawisk fizycznych), użyj generatorów sprzętowych lub usług takich jak random.org.
Czy mogę wygenerować losowe liczby bez powtarzania?
Tak — to nazywa się próbkowaniem bez odstawiania. Kalkulator używa algorytmu Fisher-Yatesa: generuj wszystkie wartości w zakresie, zamień je losowo, zwróć pierwsze N. To gwarantuje, że każda wartość pojawia się najwyżej raz i każda kombinacja jest równie prawdopodobna.
Jak duże jest prawdopodobieństwo uzyskania tej samej liczby dwukrotnie?
Z odstawianiem (tryb standardowy), dla zakresu N wartości, prawdopodobieństwo uzyskania tej samej wartości podczas dwóch kolejnych losowań wynosi 1/N. Dla zakresu 1–100: 1% na parę. W ciągu wielu losowań powtarzania są oczekiwane i normalne. Z trybem "bez powtarzania" powtarzania są niemożliwe przez projekt.
Czy mogę używać tego do wyboru liczb loteryjnych?
Absolutnie. Ustaw zakres na odpowiedni do Twojej loterii (np. 1–49) i włącz "bez powtarzania" do wyboru unikalnych liczb. Każda kombinacja jest równie prawdopodobna — żadna liczba ani kombinacja nie jest bardziej lub mniej prawdopodobna do wygrania. Loteria sama jest losowa, więc każdy sposób wyboru jest równie ważny.
Co to jest nasionko w generowaniu liczb losowych?
Nasionko to wartość początkowa dla pseudolosowego generatore liczby. Taka sama wartość zawsze powoduje tę samą sekwencję. Jest to przydatne dla symulacji powtarzalnych — ustaw nasionko, uruchom symulację, zapisz nasionko, a możesz później powtórzyć tę samą sekwencję losową do weryfikacji lub debugowania.
Jak wybrać losowy element z listy?
Numeryuj elementy od 1 do N, a następnie wygeneruj losową liczbę całkowitą od 1 do N. Odpowiedni element jest Twoim losowym wyborem. Na przykład, aby wybrać losowo 7 członków zespołu, wygeneruj losową liczbę całkowitą od 1 do 7. Każdy członek ma równy 1/7 ≈ 14,3% szansę na wybór.
Czy Math.random() w JavaScript jest naprawdę losowy?
Nie. Math.random() jest prostym PRNG bez gwarancji bezpieczeństwa. Jest on wystarczający dla gier i aplikacji niezwiązanych z bezpieczeństwem, ale nigdy nie powinien być używany do celów kryptograficznych (generowanie kluczy, tokenów, haseł). W przypadku aplikacji bezpieczeństwa zawsze używaj crypto.getRandomValues() lub serwerowego CSPRNG.
Co to jest różnica między PRNG a CSPRNG?
PRNG (Pseudolosowy Generator Liczb) jest deterministyczny i szybki, ale przewidywalny, jeśli wiesz wystarczająco o jego stanie. CSPRNG (CSPRNG) dodaje własność, że wyjścia są komputacyjnie niewykrywalne od prawdziwej losowości nawet jeśli atakujący obserwuje niektóre wyjścia. CSPRNG wymagane są dla haseł, kluczy i tokenów.
Co to jest symulacja Monte Carlo?
Symulacja Monte Carlo używa dużych liczb losowych do oszacowania złożonych wielkości. Przykład: oszacowanie π przez losowe umieszczenie punktów w kwadracie zawierającym koło — stosunek punktów wewnątrz koła do punktów ogólnych konwerguje do π/4. Metody Monte Carlo są używane w finansach, fizyce, inżynierii i statystyce.
Czy generatory liczb losowych mogą być zaniżone?
Generatory o niskiej jakości mogą wykazywać zaniżenie — niektóre wartości pojawiają się częściej niż inne, lub korelacje między kolejnymi wartościami. Jakość jest mierzona przez testy statystyczne (NIST Test Suite, TestU01 BigCrush). Nowoczesne algorytmy, takie jak Mersenne Twister, PCG i xoshiro, przeszły wszystkie standardowe testy i są nieskalanymi dla praktycznych celów.
Nieprzewidywalność w grach i generacja proceduralna
Wideo gry opierają się na losowości. Od losowego generowania pól w świecie Minecrafta do losowego zachowania AI wroga, wysokiej jakości losowość tworzy nieprzewidywalne doświadczenia. Proceduralna generacja zawartości (PCG) wykorzystuje liczby losowe z matematycznymi ograniczeniami do tworzenia ogromnej zawartości z minimalnym wysiłkiem ręcznym — 18 kwintylionów planet w No Man's Sky zostało wszystkie generowane proceduralnie z losowymi nasionami.
Grę roguelike, takie jak Nethack, Spelunky i Hades, definiuje gatunek poprzez proceduralną generację poziomów. Każda rozgrywka generuje różny labirynt, umieszczenie wroga i dystrybucję przedmiotów. Gra nasiona tej losowości tak, aby rozgrywki czuły się sprawiedliwe (RNG nie losowo decyduje, że umierasz natychmiast) podczas gdy pozostają nieprzewidywalne. Wiele roguelików wyświetla nasiona, aby gracze mogli powtórzyć identyczną rozgrywkę lub podzielić się interesującymi nasionami z innymi.
Grę stołowe używały fizycznej losowości (kości, wymieszanego talonu, wrotki) od wieków. Cyfrowe odpowiedniki muszą emulować te dystrybucje dokładnie. Standardowa rzucona kość sześcianu używa jednolitej dystrybucji nad {1,2,3,4,5,6}. Rzut z wymieszanego talonu używa losowej permutacji. Niektóre gry używają puli kości (rzuć kilka kości, weź najwyższy) lub kości z zaletą/wadą — wymagające starannego projektowania statystycznego, aby osiągnąć wymaganą dystrybucję prawdopodobieństwa.
Generowanie innych dystrybucji z liczbami losowymi jednolitymi
Większość RNG produkuje liczby jednolite rozłożone między 0 a 1 (lub liczby całkowite w zakresie). Czasami potrzebujemy liczb losowych, które odpowiadają innych dystrybucjom — normalnej, eksponencjalnej, Poissona itp. Te mogą być odziedziczone z liczbami losowymi jednolitymi za pomocą metod transformacji.
Metoda Box-Mullera generuje liczby losowe normalnie rozłożone z dwóch liczb losowych U₁ i U₂: Z₁ = √(−2ln(U₁)) × cos(2πU₂) i Z₂ = √(−2ln(U₁)) × sin(2πU₂). Oba Z₁ i Z₂ mają standardową dystrybucję normalną N(0,1). Skaluj Z × σ + μ, aby dostać się do N(μ,σ²).
Metoda Inwersji Transformacji używa odwrotności funkcji kumulatywnej dystrybucji (CDF). Dla dystrybucji eksponencjalnej z szybkością λ: X = −ln(1−U)/λ, gdzie U jest jednolitą w [0,1]. Ta metoda bezpośrednio przekształca zmienną losową jednolitą w eksponencjalnie rozłożoną. Metoda działa dla dowolnej dystrybucji z odwrotnie inwersyjną CDF.
Statystyczne testy dla losowości
Jak możemy zweryfikować, czy generator liczb losowych jest naprawdę losowy? Testy statystyczne sprawdzają, czy sekwencja liczb wyświetla wzory, które byłyby niewygodne w prawdziwie losowej sekwencji. Pakiet testów statystycznych NIST zawiera 15 testów służących do oceny generatorów losowych dla zastosowań kryptograficznych. Kluczowe testy obejmują:
Test częstości (Monobit): Sprawdza, czy 0 i 1 występują z równą częstotliwością w reprezentacji binarnej wygenerowanych liczb. Moneta z biasem, która pada głową 60% czasu, nie powinna zdać tego testu.
Test przebiegów: Sprawdza liczbę kolejnych identycznych bitów (przebiegów). Za duże przebiegi tego samego bita wskazują na nie-losowy wzór. Prawdziwa losowa sekwencja ma przewidywalną dystrybucję długości przebiegów.
Test serii: Sprawdza, czy pary, trójki lub czwórki wartości występują z równą częstotliwością. Jeśli generator wygeneruje sekwencję 1,2,3,4,5,6,1,2,3,4,5,6... to zda test częstości, ale nie zda testu serii — pary są nie-losowe.
| Statystyczny test | Co wykrywa | Pakiet testów NIST? |
|---|---|---|
| Test częstości (Monobit) | Nierówna częstość 0/1 | Tak |
| Test przebiegów | Zbyt wiele/zbyt mało kolejnych identycznych wartości | Tak |
| Autokorelacja | Wartości korelowane z poprzednimi wartościami | Tak |
| Chi-Square | Niejednorodna dystrybucja | Tak (test częstości) |
| Urodziny odstępu | Zbyt regularne odstępy między wartościami | Poprzez TestU01 |
| Diehard | Wiele testów wzorów | Odrębny pakiet |
Pakiet testów TestU01 "BigCrush" uważany jest za najbardziej rygorystyczny praktyczny test — wykonuje 106 testów i odrzuca wiele algorytmów, które zdały mniejsze pakiety testów. Nowoczesne algorytmy, takie jak PCG i xoshiro, zdały BigCrush; starsze algorytmy, takie jak generator liniowy związany z kongruencją używany w wczesnych bibliotekach C, nie zdały kilku testów i nie powinny być używane w aplikacjach o wysokiej jakości.
Użycie tego generatora liczb losowych
Ustaw minimalną i maksymalną wartość, aby zdefiniować zakres. Ustaw "ile" do wygenerowania wielu liczb jednocześnie. Włącz opcję "bez powtórzeń" do wygenerowania listy unikalnych liczb (losowanie bez powtórzeń) — idealne dla losowania w loterii, losowania kart lub przydziału uczestników do grup bez powtórzeń. Wygenerowana sekwencja używa kryptograficznego API przeglądarki do wysokiej jakości wyników odpowiednich dla każdego niezabezpieczonego celu. W przypadku loterii wygeneruj liczbę równą wymaganemu liczbie wylosowań w zakresie loterii. W przypadku losowania wstawiennictwa przypisz kolejne numery do wpisów i wylosuj odpowiadający numer. Wyniki są wygenerowane od nowa każdorazowo, gdy naciśniesz przycisk — poprzednie wyniki nie są przechowywane ani śledzone.