Atsitiktinių skaičių generatorius

Acrafto Team Matematika
Atnaujinta
Greiti šablonai
Viskas vyksta jūsų naršyklėje. Joks skaičius niekada nepalieka jūsų įrenginio.

Kaip veikia atsitiktinių skaičių generatorius?

Generatorius suteikia jums du atsitiktinumo šaltinius, o jūs pasirenkate, kuris tinka jūsų užduočiai.

Saugus atsitiktinumas semiasi entropijos iš jūsų operacinės sistemos per Web Crypto API (crypto.getRandomValues()). Jis yra nenuspėjamas ir nepakartojamas – tinkamas pasirinkimas tikram traukimui, kurio rezultato niekas neturėtų sugebėti atspėti iš anksto.

Sėklinis režimas paverčia bet kokį jūsų įvestą tekstą deterministinio generatoriaus (xoshiro128**) pradine būsena. Ta pati sėkla visada sugeneruoja tuos pačius skaičius, todėl bet kas gali pakartoti jūsų traukimą ir patvirtinti, kad gavote būtent tai, ką teigiate gavę.

Abu veikia visiškai jūsų naršyklėje. Jokie skaičiai niekada nepasiekia serverio.

Jokio modulio šališkumo (modulo bias)

Dauguma paprastų generatorių atsitiktinę 32 bitų reikšmę pritaiko jūsų diapazonui naudodami value % range. Kai diapazonas nesidalija tolygiai iš 2³², mažiausi skaičiai pasirodo šiek tiek dažniau nei likusieji. Per tūkstančius traukimų tai tampa išmatuojama.

Šis generatorius vietoj to naudoja atmetimo atranką (rejection sampling): reikšmės, kurios patektų į netolygią „uodegą“, yra atmetamos ir traukiamos iš naujo. Kiekvienas jūsų diapazono skaičius turi lygiai tokią pačią tikimybę. Tai galite patikrinti patys naudodami įmontuotą tolygumo testą.

Ką moka generatorius

Diapazonas

  • Minimumas ir maksimumas – bet koks sveikasis ar dešimtainis diapazonas, įskaitant neigiamas reikšmes
  • Kiek skaičių – nuo 1 iki 1 000 000 viename traukime
  • Be pasikartojimų – kiekvienas skaičius pasirodo ne daugiau kaip vieną kartą, kaip tikrame traukime
  • Rūšiavimas – traukimo tvarka, didėjimo ar mažėjimo tvarka; rūšiavimas niekada nepaliečia atsitiktinumo
  • Žingsnis – apribokite rezultatus iki reikšmės kartotinių, kad pasirodytų tik 0, 5, 10, 15
  • Išskirti skaičiai – nurodykite reikšmes, kurios niekada neturi būti ištrauktos

Režimas

  • Atsitiktinumo šaltinis – saugus (Web Crypto) arba sėklinis (pakartojamas)
  • Sėkla – bet koks tekstas; ta pati sėkla visada pakartoja tą patį traukimą
  • Skirstinys – tolygus, normalusis (Gauso), eksponentinis, Puasono, trikampis, binominis
  • Svoriai – suteikite pasirinktiems skaičiams didesnę tikimybę, užrašomi kaip number:weight
  • Kauliukų žymėjimas3d6+2, d20, 2d20kh1 pranašumui, 4d6dl1 savybių metimams

Išvestis

  • Skirtukas – kablelis, tarpas, kabliataškis, tabuliacija, nauja eilutė arba bet koks jūsų įvestas simbolis
  • Skaičių sistema – dešimtainė, dvejetainė, aštuntainė, šešioliktainė arba 36 pagrindo
  • Užpildymas nuliais – paverskite 7 į 007 bilietų ar ID numeriams
  • Priešdėlis ir priesaga – apgaubkite kiekvieną skaičių fiksuotu tekstu
  • Šablonas{n} yra skaičius, {i} – jo pozicija, taigi user{n} tampa user42
  • Kopijuoti kaip – paprastą tekstą, CSV, JSON arba Markdown lentelę

Statistika

Kiekvienas traukimas apibendrinamas gyvai: suma, vidurkis, mediana, mažiausia, didžiausia reikšmė, standartinis nuokrypis, taip pat kiek rezultatų yra lyginiai, nelyginiai ar pirminiai skaičiai. Histograma parodo skirstinio formą, o chi kvadrato testas pasako, ar rezultatai iš tiesų atitinka tolygų skirstinį.

Istorija

Paskutiniai 50 traukimų saugomi jūsų naršyklėje kartu su nustatymais, kuriais jie buvo sugeneruoti – vienu paspaudimu galite atkurti bet kurį iš jų. Dažnai naudojamas konfigūracijas galima išsaugoti kaip pavadintus šablonus, o visą sąrašą eksportuoti į JSON failą, kurį galite importuoti kitame įrenginyje. Niekas nesaugoma niekur kitur, tik šioje naršyklėje.

Klaviatūra

Paspauskite tarpo klavišą arba R, kad ištrauktumėte dar kartą nesiekdami pelės.

Greitieji šablonai

ŠablonasDiapazonasKiekisNaudojimas
🎲 Kauliukas1–61Stalo žaidimai, sprendimų priėmimas
🪙 Moneta0–11Herbas ar skaičius
🎰 Loterija1–496Unikalūs, surūšiuoti, kaip tikrame traukime
💯 1–1001–1001Procentai, A/B padalijimai
🔢 PIN0–94Keturi skaitmenys, pasikartojimai leidžiami

Pakartojami traukimai

Sėklinis režimas skirtas tiems atvejams, kai „patikėkite, tai buvo atsitiktinai“ neužtenka.

Iš anksto pasirinkite sėklą, dėl kurios visi gali susitarti – datą, saitažodį, viešai paskelbtą kokios nors reikšmės uždarymo kainą – ir paskelbkite ją prieš traukimą. Tuomet bet kas gali įvesti tą pačią sėklą su tais pačiais nustatymais ir gauti identišką rezultatą. Jūs neįrodėte, kad skaičiai buvo nenuspėjami; jūs įrodėte, kad netraukėte iš naujo, kol negavote patinkančio atsakymo.

Tai taip pat būdas padaryti atsitiktinumą pakartojamą darbe, kurį reikia patikrinti: atrankos planas, kurį kolega gali paleisti iš naujo, testinių įtaisų (fixtures) rinkinys, kuris išlieka stabilus visame testų pakete, klasės užduotis, kurioje kiekvienas mokinys gauna tuos pačius „atsitiktinius“ duomenis.

Skirstinio pasirinkimas

Tolygus skirstinys suteikia kiekvienam diapazono skaičiui vienodą tikimybę. Tai paprastai turima omenyje sakant „atsitiktinis“, ir tai yra numatytasis pasirinkimas.

Kiti skirstiniai sutelkia rezultatus aplink tam tikrą reikšmę, o taip dažniausiai elgiasi ir realaus pasaulio dydžiai:

  • Normalusis (Gauso) – ūgiai, matavimo paklaidos, testų rezultatai. Nustatykite vidurkį ir standartinį nuokrypį.
  • Eksponentinis – laukimo laikas tarp nepriklausomų įvykių.
  • Puasono – įvykių skaičius fiksuotame intervale: atvykimai per valandą, defektai partijoje.
  • Trikampis – kai žinote minimumą, maksimumą ir labiausiai tikėtiną reikšmę, bet nieko daugiau. Dažnai naudojamas projektų vertinimuose.
  • Binominis – sėkmių skaičius iš fiksuoto bandymų skaičiaus su fiksuota tikimybe.

Kiekvienas skirstinys apkarpomas pagal jūsų nustatytą diapazoną, todėl ilga Gauso „uodega“ negali ištrūkti už jūsų minimumo ir maksimumo ribų.

Kur naudojami atsitiktiniai skaičiai

Žaidimai ir pramogos

  • Stalo žaidimai – kauliukų metimas, eilės nustatymas
  • Stalo RPG žaidimai4d6dl1 savybių metimams, 2d20kh1 pranašumui
  • Dovanų traukimai – nugalėtojo pasirinkimas su sėkla, kad dalyviai galėtų patikrinti
  • Viktorinos – atsitiktinė klausimų tvarka

Statistika ir mokslas

  • Mėginių ėmimas – imties traukimas iš populiacijos be pasikartojimų
  • A/B testavimas – dalyvių priskyrimas grupėms
  • Monte Karlo simuliacija – tikimybės vertinimas kartojant
  • „Bootstrapping“ – pakartotinis mėginių ėmimas neapibrėžtumui vertinti

Programavimas

  • Testavimo duomenys – milijonas reikšmių, generuojamas fone, kad puslapis liktų atsakingas
  • Testiniai įtaisai (fixtures) – sėkliniai, kad nepavykęs testas nepavyktų vienodai du kartus
  • Atsitiktiniai ID – su užpildymu, priešdėliais ar šablonu
  • Apkrovos testavimas – šablonais paremti identifikatoriai, pvz., user{n}@example.com

Tikri vs. pseudoatsitiktiniai skaičiai

Math.random()crypto.getRandomValues()Sėklinis (xoshiro128**)
TipasPseudoatsitiktinisKriptografiškai saugusPseudoatsitiktinis, deterministinis
Entropijos šaltinisVariklio pasirinkta sėklaSistemos CSPRNGJūsų sėklos tekstas
Nuspėjamas?GalimaiNeTaip, sąmoningai
Pakartojamas?NeNeVisada
Tinka saugumuiNeTaipNe
Tinka statistikaiPriklausoTaipTaip
Tinka patikrinamiems traukimamsNeNeTaip

Šiame įrankyje Math.random() niekur nenaudojamas.

Traukimai be pasikartojimų

Įjungus Be pasikartojimų, kiekvienas diapazono skaičius pasirodo ne daugiau kaip vieną kartą. Puikiai tinka:

  • Dovanų traukimai – niekas negali laimėti du kartus
  • Permutacijos – elementų rinkinio maišymas
  • Bingo – iškviestų skaičių, kurie lieka iškviesti
  • Loterija – šeši skirtingi skaičiai iš 1 iki 49

Traukimas naudoja dalinį Fisher–Yates maišymo algoritmą, todėl prašyti 6 skaičių iš milijono yra taip pat greita, kaip prašyti 6 iš 49 – jis niekada nesikartoja tikėdamasis išvengti susidūrimo. Jei paprašote daugiau unikalių skaičių, nei diapazonas gali pasiūlyti, generatorius apie tai praneša, o ne užstringa.

Rezultatų eksportavimas

Nukopijuokite skaičius kaip paprastą tekstą su bet kokiu jums patinkančiu skirtuku, kaip CSV skaičiuoklei, kaip JSON kodui arba kaip Markdown lentelę dokumentacijai. Labai dideli traukimai išlieka atmintyje visa apimtimi ir kopijuojami visa apimtimi, net jei ekrane rodomi tik pirmieji keli tūkstančiai.

Atsitiktinių skaičių generavimas savo kode

JavaScript / TypeScript

// Kriptografiškai saugus sveikasis skaičius intervale [min, max], be modulio šališkumo.
// Naivus `value % range` favorizuoja mažus skaičius, kai diapazonas nesidalija
// tolygiai iš 2**32 - todėl atmetame reikšmes netolygioje "uodegoje".
function randomInt(min, max) {
  const range = max - min + 1;
  const limit = Math.floor(0x100000000 / range) * range;
  const arr = new Uint32Array(1);
  let value;
  do {
    crypto.getRandomValues(arr);
    value = arr[0];
  } while (value >= limit);
  return min + (value % range);
}

Python

import random
import secrets

# Kriptografiškai saugu, be modulio šališkumo
n = secrets.randbelow(max - min + 1) + min

# Pakartojama: ta pati sėkla visada duoda tą pačią seką
rng = random.Random('my-seed')
n = rng.randint(min, max)

# Be pasikartojimų
sample = random.sample(range(min, max + 1), count)

PHP

// Kriptografiškai saugu (PHP 7+), be modulio šališkumo
$n = random_int($min, $max);

// Pakartojama
mt_srand(crc32('my-seed'));
$n = mt_rand($min, $max);

Dažnai užduodami klausimai (DUK)

Ar rezultatas tikrai atsitiktinis? Saugiame režime – taip. Jis gaunamas iš crypto.getRandomValues(), kriptografiškai saugaus generatoriaus, maitinamo jūsų operacinės sistemos entropijos šaltinio. Rezultatai yra tolygiai paskirstyti ir nenuspėjami. Sėklinis režimas sąmoningai yra priešingybė: jis yra pakartojamas, ir tai yra jo esmė.
Kiek skaičių galiu sugeneruoti vienu metu? Iki 1 000 000. Traukimai virš 50 000 apskaičiuojami fono darbuotojo (worker) procese, kad puslapis liktų atsakingas, o ekrane rodomi pirmieji 2 000 su likusių skaičiumi – kopijuojant vis tiek gaunate viską.
Ar galiu generuoti neigiamus skaičius? Taip. Nustatykite neigiamą minimumą. Veikia visas JavaScript skaičių diapazonas, įskaitant neigiamus diapazonus iš abiejų pusių.
Ar rūšiavimas veikia atsitiktinumą? Ne. Skaičiai pirmiausia ištraukiami, o vėliau surūšiuojami. Rūšiavimas keičia tik jų rodymo tvarką.
Ar ta pati sėkla rytoj duos tuos pačius skaičius? Taip, ir bet kuriame kitame įrenginyje ar naršyklėje. Sėklinis generatorius yra visiškai deterministinis ir priklauso tik nuo jūsų sėklos ir nustatymų.
Ką man pasako tolygumo testas? Jis atlieka chi kvadrato testą, palygindamas, kaip dažnai kiekvienas skaičius iš tikrųjų pasirodė, su tuo, kaip dažnai jis turėjo pasirodyti. Jei statistika lieka žemiau kritinės reikšmės, rezultatai atitinka tolygų skirstinį. Kad testas turėtų prasmę, reikia palyginti siauro diapazono ir pakankamai traukimų – bent penkių kiekvienai galimai reikšmei.
Kaip veikia svoriai? Užrašykite juos kaip number:weight poras, pavyzdžiui 1:5, 2:1, 3:1. Čia 1 yra penkis kartus labiau tikėtinas nei 2 arba 3. Skaičiai, kurių nenurodėte, gauna nulinį svorį ir niekada nėra ištraukiami.
Koks kauliukų žymėjimas palaikomas? 3d6 meta tris šešiabriaunius kauliukus. Pridėkite modifikatorių su 3d6+2. Palikite ar atmeskite kauliukus naudodami kh, kl, dh, dl – taigi 2d20kh1 palieka didesnį iš dviejų d20 (pranašumas), o 4d6dl1 atmeta mažiausią iš keturių d6.
Ar mano istorija kur nors saugoma? Tik šioje naršyklėje, vietinėje saugykloje (local storage). Ji niekada nepasiekia serverio, nesinchronizuojama su kitu įrenginiu ir išnyksta, jei išvalote svetainės duomenis. Eksportuokite ją į JSON, jei norite ją išsaugoti ar perkelti.

Būčiau dėkingas, jei pasidalintumėte šiais puslapiais su draugais, išsaugotumėte juos žymėse ar nuorodą. Ačiū! 🙏