Véletlenszám-generátor: Hogyan generálnak véletlen számokat a számítógépek?

Az emberek évezredek óta véletlenszerű számokat használnak, ezért a koncepció nem új keletű. Az ókori Babilon lottójátékától kezdve a rulettasztalokig Monte Carlóban, a kockajátékig Vegasban a cél az, hogy a végeredményt véletlenszerű véletlenszerűségre bízzák.

De a szerencsejátékot leszámítva, a véletlenszerűségnek sok haszna van a tudományban, a statisztikákban, a rejtjelezésben és egyebekben. A kockák, érmék vagy hasonló adathordozók véletlenszerű eszközként való használatának megvannak a maga korlátai.

Ezen technikák mechanikai jellege miatt nagy mennyiségű véletlenszám előállítása sok időt és munkát igényel. Az emberi találékonyságnak köszönhetően erőteljesebb eszközök és módszerek állnak rendelkezésünkre.

Módszerek véletlenszámok előállítására

Igaz véletlenszerű számok

szabad formájú elektronikai robot nézelődik

Vizsgáljuk meg a véletlenszámok előállítására használt két fő módszert. Az első módszer azalapuló fizikai folyamat, és termés a forrás véletlenszerűség néhány fizikai jelenség, amely várhatóan , hogy véletlen .

Ilyen jelenség a számítógépen kívül zajlik. Megmérik és a mérési folyamat miatti torzításokhoz igazítják. Ilyen például a radioaktív bomlás, a fotoelektromos hatás, a kozmikus háttérsugárzás, a légköri zaj (amelyet ebben a cikkben használunk) és még sok más.

Tehát az ilyen véletlenszerűség alapján generált véletlenszámokat " igaz " véletlenszámoknak mondják .

Technikailag a hardver rész egy olyan eszközből áll, amely energiát alakít át egyik formáról a másikra (például a sugárzást elektromos jellé), egy erősítőből és egy analóg-digitális átalakítóból, hogy a kimenetet digitális számokká alakítsa.

Melyek az álvéletlenszerű számok?

Hacker bináris támadási kód.  Canon 5d Mark III és analóg vintage lencsével készült, Leica APO Macro Elmarit-R 2.8 100mm (Év: 1993)

Az "igaz" véletlenszámok alternatívájaként a véletlenszámok előállításának második módszere olyan számítási algoritmusokat tartalmaz, amelyek látszólag véletlenszerű eredményeket képesek előállítani.

Miért látszólag véletlenszerű? Mivel a kapott végeredményeket valójában teljesen meghatározza egy kezdeti érték, más néven magérték vagy kulcs . Ezért, ha ismerné a kulcsértéket és az algoritmus működését, megismételheti ezeket a látszólag véletlenszerű eredményeket.

Az ilyen típusú véletlenszám-generátorokat gyakran ál- véletlenszám-generátoroknak nevezik , és ennek eredményeként ál- véletlenszerű számokat adnak ki .

Annak ellenére, hogy az ilyen típusú generátorok általában nem gyűjtenek adatokat a természetesen előforduló véletlenszerűség forrásaiból, a kulcsok ilyen összegyűjtése szükség esetén lehetővé válik.

Hasonlítsuk össze a valódi véletlenszám-generátorok vagy a TRNG- k és az álvéletlenszám-generátorok vagy a PRNG- k néhány aspektusát .

A PRNG gyorsabb, mint a TRNG. Determinisztikus jellege miatt hasznosak, ha véletlenszerű események sorozatát kell lejátszania. Ez sokat segít például a kódtesztelésben.

Másrészt a TRNG-k nem időszakosak és jobban működnek a biztonság szempontjából érzékeny szerepekben, például a titkosításban.

A periódus az az ismétlések száma, amelyeken a PRNG átmegy, mielőtt elkezdené ismételni magát. Így, ha minden más dolog egyenlő, egy hosszabb időtartamú PRNG-nek több számítógépes erőforrásra lenne szüksége az előrejelzéshez és a feltöréshez.

Példa algoritmus az ál-véletlenszerű számgenerátorra

A számítógép végrehajtandó kódot hajt végre, amely egy sor követendő szabályon alapul. A PRNG-k esetében általában ezek a szabályok a következők körül forognak:

  1. Fogadjon el néhány kezdeti beviteli számot, vagyis egy magot vagy kulcsot.
  2. Az eredmény létrehozásához matematikai műveletek sorozatában alkalmazza ezt a magot. Ez az eredmény a véletlenszerű szám.
  3. Használja , hogy kapott véletlen számot, mint a mag a következő iteráció.
  4. Ismételje meg a folyamatot a véletlenszerűség utánzásához.

Most nézzünk meg egy példát.

A lineáris kongruenciális generátor

Ez a generátor pszeudorandom számok sorozatát állítja elő. Mivel egy kezdeti mag X 0 és integer paraméterek egy , mint a multiplikátor, b , mint a növekmény, és m , mint a modulus, a generátor által meghatározott lineáris kapcsolatban: X n ≡ (AX n-1 + b) mod m . Vagy programozásbarátabb szintaxist használ: X n = (a * X n-1 + b)% m .

Ezen tagok mindegyikének meg kell felelnie a következő feltételeknek:

  • m> 0 (a modulus pozitív),
  • 0 <a <m (a szorzó pozitív, de kisebb, mint a modulus),
  • 0b <m (aa növekmény nem negatív, de kisebb, mint a modulus), és
  • 0X 0 <m (a mag nem negatív, de kisebb, mint a modulus).

Hozzunk létre egy JavaScript függvényt, amely a kezdeti értékeket argumentumként veszi fel, és egy adott hosszúságú véletlenszám tömböt ad vissza:

 // x0=seed; a=multiplier; b=increment; m=modulus; n=desired array length; const linearRandomGenerator = (x0, a, b, m, n) => { const results = [] for (let i = 0; i < n; i++) { x0 = (a * x0 + b) % m results.push(x0) } return results } 

A lineáris kongruenciális generátor az egyik legrégebbi és legismertebb PRNG algoritmus.

Ami a számítógépek által futtatható véletlenszám-generátor algoritmusokat illeti, azok már az 1940-es és 50-es évekből származnak (például a Közép-négyzet módszer és a Lehmer-generátor), és ma is íródnak (Xoroshiro128 +, Squares RNG és így tovább) .

Egy minta véletlenszám-generátor

Amikor úgy döntöttem, hogy megírom ezt a cikket egy véletlenszám-generátor beágyazásáról egy weboldalra, választanom kellett.

Használhattam volna a JavaScript Math.random()függvényét alapként, és kimenetet generálhatnék pszeudorandom számokban, hasonlóan a korábbi cikkekhez (lásd: Szorzótábla - Saját időkód kódolása).

De ez a cikk maga a véletlenszámok előállításáról szól. Ezért úgy döntöttem, hogy megtanulom, hogyan gyűjtsem össze az "igazi" véletlenszerűségen alapuló adatokat és osszam meg veled felfedezésemet.

Tehát az alábbiakban található az "igazi" véletlenszám-generátor. Állítsa be a paramétereket, és nyomja meg a Generate gombot.

Igaz véletlenszám-generátor bináris tizedes hexadecimális eredmény létrehozása:

The code fetches data from one of the APIs, courtesy of Random.org. This online resource has a plethora of useful, customizable tools and comes with excellent documentation to go with it.

The randomness comes from atmospheric noise. I was able to use asynchronous functions. That is a huge benefit going forward. The core function looks like this:

 // Generates a random number within user indicated interval const getRandom = async (min, max, base) => { const response = await  fetch("//www.random.org/integers/?num=1&min="+min+" &max="+max+"&col=1&base="+base+"&format=plain&rnd=new") return response.text() }

The parameters it takes allow a user to customize random number output. For example, min and max allow you to set lower and upper limits on generated output. And base determines if the output is printed as binary, decimal or hexadecimal.

Again, I chose this configuration but there are many more available at the source.

A Generálás gombra kattintva a handleGenerate()függvény meghívásra kerül. Viszont meghívja az getRandom()aszinkron függvényt, kezeli a hibakezelést és eredményeket ad ki:

 // Output handling const handleGenerate = () => { handleActive(generateButton) const base = binary.checked ? 2 : decimal.checked ? 10 : 16 if (!minimum.value || !maximum.value) { prompter.style.color = 'red' prompter.textContent = "Enter Min & Max values" } else { getRandom(minimum.value, maximum.value, base).then((data) => { resultValue.textContent = data prompter.textContent = "" }).catch((error) => { resultValue.textContent = 'ERROR' prompter.textContent = 'Connection error. Unable to generate'; }) handleRestart() } } 

A kód többi része a HTML felépítésével, megjelenésével és stílusával foglalkozik.

A kód kész beágyazni és felhasználni ezen a weboldalon. Alkatrészekre bontottam, és részletes megjegyzéseket fűztem hozzá. Könnyen módosítható. Az igényeinek megfelelően módosíthatja a funkcionalitást és a stílusokat is.

Ez a link a teljes kód GitHub-repójához: //github.com/sandroarobeli/random-generator