> generator liczb losowych <
// Generuj kryptograficznie losowe liczby całkowite i dziesiętne — lub użyj ziarna dla powtarzalnych uruchomień
Losowość kryptograficzna
Domyślnie używa crypto.getRandomValues() z próbkowaniem odrzucającym, dzięki czemu każda liczba całkowita w Twoim zakresie jest jednakowo prawdopodobna — bez obciążenia modulo.
Powtarzalny tryb z ziarnem
Podaj dowolny ciąg ziarna, aby przełączyć się na deterministyczny PRNG mulberry32. To samo ziarno, te same liczby — idealne do testów i symulacji.
Tryb bez duplikatów
Generuj unikalne liczby całkowite za pomocą próbkowania w stylu Fishera-Yatesa. Świetne do losowań loterii, losowań nagród lub próbkowania bez zwracania.
Kontrola precyzji dziesiętnej
Przełącz na tryb dziesiętny i wybierz od 1 do 10 miejsc. Liczby są równomiernie rozłożone w przedziale [min, maks) i zaokrąglane do wybranej precyzji.
// O GENEROWANIU LICZB LOSOWYCH
Jak to działa:
Gdy pole ziarna jest puste, to narzędzie wywołuje crypto.getRandomValues(new Uint32Array(1)), CSPRNG (kryptograficznie bezpieczny PRNG) zasilany pulą entropii Twojego systemu operacyjnego. Aby odwzorować 32-bitową liczbę całkowitą bez znaku na dowolny zakres [min, max] bez obciążenia modulo, generator stosuje próbkowanie odrzucające: każde losowanie powyżej największej wielokrotności zakresu, która mieści się w 2^32, jest odrzucane i losowane ponownie. Gdy podasz ziarno, ciąg jest haszowany za pomocą cyrb53 do 32-bitowej liczby całkowitej i przekazywany do mulberry32, szybkiego 32-bitowego PRNG o okresie 2^32 — deterministycznego i powtarzalnego. Tryb dziesiętny skaluje równomierną próbkę [0,1) do [min, max), a następnie formatuje za pomocą toFixed(places).
Przykład:
min=1, max=100, count=5, seed="hello" -> 39, 98, 64, 12, 71 (zawsze)
Standardy i odniesienia:
- >Web Crypto API (W3C) — kontrakt
crypto.getRandomValues()dla CSPRNG - >RFC 4086 — Randomness Requirements for Security
- >mulberry32 — 32-bitowy PRNG autorstwa Tommy'ego Ettingera, domena publiczna
- >cyrb53 — szybki 53-bitowy hash ciągu do tworzenia ziarna (bryc, domena publiczna)
Typowe zastosowania:
- >Losowania loterii i nagród z udowodnialnie unikalnymi wyborami
- >Losowe próbkowanie bez zwracania do ankiet i audytów
- >Symulacje Monte Carlo i eksperymenty statystyczne
- >Podział testów A/B z powtarzalnymi przypisaniami opartymi na ziarnie
- >Mechanika gier: zamienniki kostek, tabele łupów, ziarna poziomów
- >Dane testowe QA i generowanie danych wejściowych do fuzzingu
- >Wybór zwycięzców, jurorów lub pierwszych prelegentów na spotkaniach
- >Generowanie danych syntetycznych do prototypów i prezentacji
Powiązane narzędzia:
- >Generator UUID — losowe identyfikatory v4, gdy potrzebujesz unikalnego ID zamiast liczby
- >Generator haseł — kryptograficznie losowe ciągi z kontrolą puli znaków
- >Generator BIP39 — losowe mnemoniczne frazy ziarna dla portfeli kryptowalut
- >randompickerwheel.app — interfejs koła fortuny, gdy chcesz mieć wizualny losowy selektor dla publiczności na żywo lub klasy szkolnej
// PRZYKŁADOWE WYNIKI
Losowanie loterii — 6 unikalnych liczb z 1-49
min=1, max=49, count=6, no-duplicates=on, sort=ascending
output:
7, 13, 22, 28, 35, 41
Zamiennik kostki — dziesięć rzutów k20 (duplikaty dozwolone)
min=1, max=20, count=10, no-duplicates=off, sort=none
output:
14, 3, 20, 11, 7, 14, 2, 19, 8, 11
Próbkowanie dziesiętne — 5 liczb zmiennoprzecinkowych w [0, 1) z 4 miejscami dziesiętnymi
type=decimal, min=0, max=1, count=5, places=4
output:
0.4172, 0.8635, 0.0291, 0.5508, 0.7723
Powtarzalne z ziarnem — to samo ziarno daje tę samą sekwencję
min=1, max=100, count=5, seed="hello" (uruchom dwa razy)
output:
Uruchomienie 1: 39, 98, 64, 12, 71 / Uruchomienie 2: 39, 98, 64, 12, 71
Podział — 100 ważonych wyborów A/B przez modulo całkowite
min=0, max=99, count=100, seed="experiment-42", sort=ascending
output:
0, 1, 3, 4, 7, 9, 12, ... 95, 97, 98, 99 (deterministyczne)
// ZAIMPLEMENTUJ TO SAMODZIELNIE
Jeśli wolisz wstawić algorytm bezpośrednio do własnego projektu, oto trzy prymitywy, na których zbudowane jest to narzędzie. Razem obejmują nieobciążone kryptograficzne liczby całkowite, deterministyczne strumienie z ziarnem oraz przekształcanie dowolnego ciągu ziarna w 32-bitowy stan PRNG. Wszystkie w domenie publicznej lub na licencji równoważnej MIT.
Kryptograficznie bezpieczna liczba całkowita w [min, max] (bez obciążenia modulo)
function secureRandomInt(min, max) {
const range = max - min + 1;
const buf = new Uint32Array(1);
const max32 = 0xFFFFFFFF;
const limit = Math.floor((max32 + 1) / range) * range;
let v;
do {
crypto.getRandomValues(buf);
v = buf[0];
} while (v >= limit);
return min + (v % range);
}
mulberry32 — deterministyczny PRNG z ziarnem (stan 32-bitowy, okres ~2^32)
function mulberry32(seed) {
let a = seed >>> 0;
return function () {
a = (a + 0x6D2B79F5) | 0;
let t = a;
t = Math.imul(t ^ (t >>> 15), t | 1);
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
};
}
// usage: const rng = mulberry32(0xC0FFEE);
// rng(); // 0.6743..., reproducible across runs
cyrb53 — szybki hash ciągu na 32 bity (użyj do tworzenia ziarna mulberry32)
function cyrb53(str, seed) {
seed = seed || 0;
let h1 = 0xdeadbeef ^ seed;
let h2 = 0x41c6ce57 ^ seed;
for (let i = 0; i < str.length; i++) {
const ch = str.charCodeAt(i);
h1 = Math.imul(h1 ^ ch, 2654435761);
h2 = Math.imul(h2 ^ ch, 1597334677);
}
h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^
Math.imul(h2 ^ (h2 >>> 13), 3266489909);
h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^
Math.imul(h1 ^ (h1 >>> 13), 3266489909);
return (h1 >>> 0);
}
// const rng = mulberry32(cyrb53('my-seed-string'));
// CZĘSTE PUŁAPKI
> Obciążenie modulo
Naiwne Math.floor(Math.random() * range) rozkłada wysokie bity nierównomiernie, gdy zakres nie jest potęgą dwójki — niektóre wyniki pojawiają się nieco częściej niż inne. Użyj próbkowania odrzucającego (fragment powyżej), aby odrzucać losowania spoza zakresu i utrzymać równomierny rozkład.
> Math.random() nie jest kryptograficznie bezpieczny
Math.random() w V8/Spidermonkey używa xorshift128+, który jest szybki, ale przewidywalny: atakujący, który zaobserwuje kilka wyników, może odtworzyć stan wewnętrzny i przewidzieć przyszłe wartości. Do tokenów, soli, krytycznych pod względem uczciwości losowań loterii lub czegokolwiek, na czym zależy przeciwnikowi, zawsze używaj crypto.getRandomValues().
> PRNG-i z ziarnem są deterministyczne — nigdy nie używaj ich do bezpieczeństwa
Mulberry32 i podobne są zaprojektowane tak, aby się powtarzać. To dokładnie to, czego chcesz do testów, symulacji i podziału — i dokładnie to, czego nie chcesz do tokenów resetowania hasła lub identyfikatorów sesji. Jeśli zauważysz, że przekazujesz ziarno do czegokolwiek skierowanego do użytkownika lub związanego z uwierzytelnianiem, natychmiast wróć do CSPRNG.
> Odrzucanie duplikatów przy dużej liczbie wyczerpuje pojemność
Prośba o k unikalnych liczb całkowitych z zakresu o rozmiarze n, gdzie k zbliża się do n, zamienia się w problem kolekcjonera kuponów: ostatnie kilka losowań staje się wykładniczo kosztowne. To narzędzie ogranicza do 10 000 i używa częściowego próbkowania Fishera-Yatesa, więc pojemność jest dokładna, ale naiwna pętla while z seen.has(x) zawiesi się po cichu, gdy k > n. Zawsze sprawdzaj pojemność z góry.
>> często zadawane pytania
P: Czy ten generator liczb losowych jest kryptograficznie bezpieczny?
O: Tak, domyślnie. Gdy pozostawisz pole ZIARNO puste, narzędzie używa crypto.getRandomValues(), CSPRNG z Web Crypto API, który w systemach Linux/macOS odczytuje z /dev/urandom, a w systemie Windows z BCryptGenRandom. Stosujemy również próbkowanie odrzucające, aby odwzorowanie z 32-bitowej liczby całkowitej na Twój niestandardowy zakres było nieobciążone. Wynik nadaje się do zadań związanych z bezpieczeństwem, takich jak generowanie tokenów, wybór soli czy przeprowadzanie uczciwych loterii. Pamiętaj, że podanie ziarna przełącza na deterministyczny PRNG (mulberry32), który nie jest kryptograficznie bezpieczny — używaj go tylko wtedy, gdy powtarzalność jest ważniejsza niż tajność.
P: Jaka jest różnica między trybem z ziarnem a bez ziarna?
O: Tryb bez ziarna (domyślny) używa CSPRNG Twojej przeglądarki i przy każdym kliknięciu produkuje świeże, nieprzewidywalne liczby — to samo wywołanie nigdy nie zwróci tej samej sekwencji dwukrotnie. Tryb z ziarnem haszuje ciąg ziarna do 32-bitowej liczby całkowitej za pomocą cyrb53 i przekazuje go do mulberry32, deterministycznego PRNG. Identyczne ziarno plus identyczne ustawienia zawsze dają identyczną sekwencję, co jest bezcenne dla powtarzalnych eksperymentów, debugowania kodu stochastycznego, udostępniania fixtures testowych lub podziału testów A/B, gdzie każdy użytkownik musi zawsze trafić do tego samego segmentu.
P: Jak działa opcja bez duplikatów?
O: W przypadku liczb całkowitych opcja bez duplikatów losuje z zakresu [min..max] przy użyciu częściowego tasowania inspirowanego algorytmem Fishera-Yatesa, które zwraca pierwsze k elementów bez powtórzeń. Używamy rzadkiej mapy zamian, dzięki czemu zużycie pamięci pozostaje na poziomie O(count) zamiast O(range), co oznacza, że losowanie 10 unikalnych liczb od 1 do 1 000 000 jest tak samo tanie jak 10 od 1 do 100. Jeśli poprosisz o więcej unikalnych liczb, niż zakres może dostarczyć (np. 20 unikalnych liczb całkowitych w 1-10), narzędzie zgłasza wyraźny błąd pojemności zamiast pętlić się w nieskończoność.
P: Czy mogę generować losowe liczby dziesiętne (zmiennoprzecinkowe)?
O: Tak. Ustaw przełącznik TYP na Dziesiętna i wybierz precyzję od 1 do 10 miejsc. Generator losuje równomierną liczbę zmiennoprzecinkową w [0, 1), skaluje ją do [min, max), następnie zaokrągla za pomocą toFixed(places) i przetwarza z powrotem na liczbę. Pamiętaj, że max jest wykluczony w trybie dziesiętnym (efekt uboczny tego, jak zdefiniowana jest równomierność zmiennoprzecinkowa). Do większości zastosowań statystycznych 4-6 miejsc dziesiętnych w zupełności wystarcza; dziesięć miejsc zbliża się do granicy podwójnej precyzji IEEE 754 dla typowych małych zakresów.
P: Czy istnieje maksymalna liczba?
O: Liczba jest ograniczona do 10 000 liczb na kliknięcie. Dzięki temu strona pozostaje responsywna na telefonach i unika brzegowych zachowań przeglądarek związanych z bardzo dużymi polami tekstowymi. Jeśli potrzebujesz milionów wartości, uruchom wiele partii z różnymi ziarnami i połącz wyniki, lub skopiuj algorytm do skryptu Node — ta sama para mulberry32 / cyrb53 działa również po stronie serwera. Ze względów UX sortowanie, kopiowanie i pobieranie odbywają się po stronie klienta, więc 10 tys. to rozsądny limit, który i tak kończy się w znacznie krótszym czasie niż milisekunda na nowoczesnym laptopie.
P: Czy moje dane są gdzieś przesyłane?
O: Nie. Każda operacja działa w Twojej przeglądarce jako zwykły JavaScript: generowanie liczb, sortowanie, statystyki, kopiowanie do schowka i pobieranie pliku .txt. Żadne żądanie nie jest wysyłane na nasze serwery, gdy klikniesz GENERATE, COPY lub DOWNLOAD — możesz to zweryfikować za pomocą zakładki Sieć w przeglądarce. Nie rejestrujemy ziaren, zakresów ani wyników. Strona to statyczny kod HTML serwowany przez HTTPS z sieci CDN, więc nic z Twoich danych wejściowych nigdy nie jest dla nas widoczne. Sprawia to, że narzędzie jest bezpieczne dla poufnych fixtures testowych, wewnętrznych ziaren loterii lub czegokolwiek innego, co wolisz trzymać z dala od serwerów stron trzecich.
P: Czy mogę uniknąć duplikatów podczas generowania liczb dziesiętnych?
O: Tak, pole wyboru bez duplikatów dotyczy również liczb dziesiętnych za pomocą pętli ponawiania działającej na zasadzie najlepszych starań. Ponieważ dwie niezależnie wylosowane liczby zmiennoprzecinkowe prawie nigdy nie kolidują na poziomie bitów, duplikaty są rzadkie, chyba że Twój zakres jest mały w stosunku do precyzji (np. min=0, max=1, places=2 ma tylko 100 różnych wartości). Jeśli pętla nie może znaleźć wystarczającej liczby unikalnych wartości w rozsądnej liczbie prób, narzędzie zgłasza błąd pojemności, abyś mógł poszerzyć zakres lub zwiększyć precyzję. W przypadku ściśle gwarantowanych unikalnych liczb dziesiętnych lepiej użyć trybu całkowitego i samodzielnie podzielić wynik.
P: Kiedy powinienem użyć koła fortuny zamiast listy liczb?
O: Lista liczb najlepiej sprawdza się w zadaniach wsadowych: losowanie 50 losów loterii, generowanie danych testowych lub zasilanie symulacji. Koło fortuny jest lepsze, gdy jedna osoba wybiera jeden element przed publicznością i chcesz uzyskać napięcie oraz wizualny efekt — losowanie imion w klasie, rozdawanie nagród na transmisji na żywo, rotacja obowiązków dzieci, spotkania decyzyjne. Jeśli to Twój przypadek użycia, zobacz randompickerwheel.app, który oferuje interaktywny interfejs koła fortuny stworzony dokładnie na tę chwilę. Oba narzędzia czerpią z tego samego prymitywu CSPRNG — różnica polega na prezentacji, a nie na uczciwości.