Co je to Pseudo-náhodné?

Pseudonáhodná čísla jsou generována počítači. Nejsou skutečně náhodné, protože když počítač funguje správně, nic, co dělá, není náhodné. Počítače jsou deterministické zařízení - chování počítače je zcela předvídatelné, podle návrhu. Abychom vytvořili něco nepředvídatelného, ​​počítače používají matematické algoritmy k produkci čísel, která jsou „náhodně dostačující“.

Pseudonáhodná čísla jsou nezbytná pro mnoho počítačových aplikací, jako jsou hry a bezpečnost. Ve hrách poskytují náhodná čísla nepředvídatelné prvky, na které může hráč reagovat, jako například vyhýbání se náhodnému náboji nebo kreslení karty z horní části balíčku.

V počítačové bezpečnosti je pseudonáhodnost důležitá v šifrovacích algoritmech, které vytvářejí kódy, které nelze předvídat ani odhadovat.

Co je to PRNG?

Generátor pseudonáhodných čísel nebo PRNG je libovolný program nebo funkce, která používá matematiku k simulaci náhodnosti. To může také být voláno DRNG (digitální generátor náhodných čísel), nebo DRBG (deterministický generátor náhodných bitů).

Matematika může být někdy složitá, ale použití PRNG vyžaduje pouze dva kroky:

  1. Poskytněte PRNG libovolnému semenu.
  2. Požádejte o další náhodné číslo.

Hodnota osiva je "výchozí bod" pro vytváření náhodných čísel. Hodnota se používá při výpočtu čísel. Pokud se hodnota semena změní, generovaná čísla se také změní a jedna hodnota osiva bude vždy produkovat stejná čísla. Z tohoto důvodu nejsou čísla skutečně náhodná, protože skutečná náhodnost nemůže být nikdy znovu vytvořena.

Aktuální čas je často používán jako jedinečná hodnota osiva. Například, jestliže to je 5. března 2018, v 5:03 PM a 7, 01324 sekund UTC, to může být vyjádřeno jako celé číslo. Přesný čas se již nikdy neobjeví, takže PRNG s tímto semenem by mělo vytvořit jedinečnou sadu náhodných čísel.

Poznámka: Může být užitečné reprodukovat náhodně generovanou sekvenci. V akademických aplikacích může být pro simulaci generována masivní posloupnost náhodných hodnot, která pak bude reprodukována přesně pro pozdější podrobnější analýzu. Jako další příklad, v počítačových hrách, jestliže hráč načte uloženou hru, nějaké “náhodné” události mohou být stejné jako jestliže hra nikdy se zastavila. Tímto způsobem hráč nemůže opakovaně načítat stejnou hru, aby se pokusil o větší štěstí.

Jak generovat pseudonáhodné číslo

Níže jsou uvedeny některé způsoby, jak vytvořit pseudonáhodné číslo ve společných programech a programovacích jazycích.

Příkazový řádek systému Windows

Proměnná % RANDOM% v příkazovém řádku systému Windows nebo v dávkovém souboru vytvoří pseudo-náhodné číslo mezi 0 a 32767, načtené s časem spuštění příkazového řádku.

 echo "So% RANDOM%!" 
 "Takže 27525!" 

Vytvoření dávkového souboru, který generuje náhodné číslo mezi 1 a 100:

 kopírovat con sorandom.bat echo off set / a myrand =% RANDOM% * 100/32768 + 1 echo Číslo, na které jsem myslel, bylo% myrand%. Dostali jste to správně? 

Stiskněte Ctrl + Z a Enter pro uložení dávkového souboru. Poté spusťte soubor:

 tak náhodný 
 Číslo, na které jsem myslel, bylo 91. Dostali jste to správně? 

Windows PowerShell

Rutina Get-Random generuje náhodné číslo mezi 0 a 2 147 483 647 (maximální hodnota 32bitového celého čísla bez znaménka).

 Get-Random 
 1333190525 

Rutina cmdlet má řadu možností, například minimální a maximální hodnotu. Hodnoty jsou zaokrouhleny dolů, aby bylo možné vygenerovat číslo mezi 1 a 100, nastavte maximální hodnotu na 101:

 Get-Random -Minimum 1 -Maximum 101 
 99 

Microsoft Excel

V tabulce aplikace Excel vygeneruje vzorec = RAND () náhodné číslo mezi 0 a 1. Pokud například zvýrazníte buňku a zadáte = RAND (), buňka bude obsahovat číslo, které se změní, kdykoli je list znovu vypočteno.

Tato metoda funguje také v jiných tabulkových aplikacích, včetně LibreOffice Calc a Google Sheets.

V programovacích jazycích

Většina programovacích jazyků má své vlastní funkce PRNG. Zde jsou některé běžné příklady:

C

V programovacím jazyce C jsou funkce PRNG definovány ve standardní knihovně stdlib . Běžným způsobem osazení generátoru náhodných hodnot je funkce time () deklarovaná v time.h. Generované číslo spadá mezi 0 a konstantu RAND_MAX, celočíselné číslo specifické pro systém garantované na hodnotu nejméně 32767.

 #include #include #include void main () {srand (time (NULL)); / * seed generátor * / int rand1 = rand (); / * pseudonáhodné celé číslo mezi 0 a RAND_MAX * / printf ("Náhodné číslo mezi 0 a% d:% d n", RAND_MAX, (int) rand1); / * Nebo, ve specifickém rozsahu: * / int min = 0; int max = 100; float rand2 = (float) rand () * max / RAND_MAX + 1; int round = (int) rand2; printf ("Náhodné číslo mezi% d a% d:% d (% f) n", min, max, kolo, rand2); vrátit se; } 

Výstup:

 Náhodné číslo mezi 0 a 2147483647: 1789080047 Náhodné číslo mezi 0 a 100: 74 (74.369179) 

C ++

V jazyce C ++:

 #include #include #include int main () {srand (time (NULL)); std :: cout << "Náhodné číslo mezi 0 a" << RAND_MAX << ":" << rand () << "n" << "Náhodné číslo mezi 1 a 100:" << (rand ()% 100) + 1 << std :: endl; návrat 0; } 

Výstup:

 Náhodné číslo mezi 0 a 2147483647: 126569208 Náhodné číslo mezi 1 a 100: 9 

Python 3

Náhodný modul v Pythonu nabízí řadu funkcí pro generování náhodných čísel. V tomto příkladu používáme tři různé metody pro nalezení náhodného celého čísla v rozsahu.

 import náhodně z datetime import datetime random.seed (datetime.now ()) print ("Náhodné číslo v rozsahu [0, 1):", random.random ()) # V rámci rozsahu. To vše dělají totéž: tisk ("Náhodné číslo mezi 1 a 100:", kolo (random.random () * 100) + 1) tisk ("Náhodné číslo mezi 1 a 100:", random.randrange (1, 101)) print ("Náhodné číslo mezi 1 a 100:", random.randint (1, 100)) 

Výstup:

 Náhodné číslo v rozsahu [0, 1]: 0, 05137418896158319 Náhodné číslo mezi 1 a 100: 27 Náhodné číslo mezi 1 a 100: 80 Náhodné číslo mezi 1 a 100: 80 

Perl 5

V Perlu:

 srand (čas); # změní se jednou za sekundu tisk "Náhodné číslo v rozsahu [0, 1]:", rand (), "n"; print "Náhodné číslo v rozsahu [1, 100]:", int (rand (101)), "n"; 

Výstup:

 Náhodné číslo v rozsahu [0, 1]: 0, 691379946963028 Náhodné číslo v rozsahu [0, 100]: 82 

JavaScript

 console.log ("Náhodné číslo v rozsahu [0, 1]:" + Math.random ()); console.log ("Náhodné číslo v rozsahu [1 100]:" + Math.floor (Math.random () * 101)); 

Zobrazení výstupu v konzole JavaScriptu webového prohlížeče (například v aplikaci Firefox stiskněte klávesy Ctrl + Shift + K ):

 Náhodné číslo v rozsahu [0, 1]: 0, 305008216755414 Náhodné číslo v rozsahu [1 100]: 8 

Poznámka: Funkci Math.random () není možné v JavaScriptu zavést. Pokud potřebujete robustní PRNG v JavaScriptu, podívejte se na lepší náhodná čísla pro JavaScript na GitHub.

Příklad PRNG: JavaScript widget

Pomocí níže uvedeného widgetu můžete načíst PRNG a použít jej k vygenerování náhodných čísel.

Pokaždé, když vygenerujete náhodné číslo ze zadaného osiva, jeho posun se zvýší o 1. První číslo vygenerované ze semene má posunutí nuly, druhý má odsazení 1 atd. Generátor vždy produkuje stejné číslo pro dané osivo a posunutí .

Zadejte cokoliv, co chcete do pole vytvořit jedinečné semeno.

Použijte tlačítko Generovat pro získání dalšího náhodného čísla pomocí tohoto semene a zvýšení posunu.

Tlačítko Reset slouží k resetování posunutí na nulu.

generované ze semen :

Obnovit posun osiva (momentálně 0 )

Tento widget používá Johannes Baagøe je open source PRNG skripty, Alea.js a Mash.js.

Bezpečnost počítačů, programování, softwarové podmínky