Pseidorandomija



Pseidorandom ilustrācija

Pseidorandomija numurus ģenerē datori. Viņi nav patiesi nejaušs , jo, kad dators darbojas pareizi, nekas, ko tas dara, ir nejaušs. Datori ir deterministiskas ierīces - datora uzvedība ir pilnībā paredzama pēc konstrukcijas. Tātad, lai izveidotu kaut ko neparedzamu, datori izmanto matemātisko algoritmi lai izveidotu skaitļus, kas ir “pietiekami nejauši”.



Kad tiek izmantoti pseidorandomālie skaitļi?

Pseidorandomālie numuri ir svarīgi daudzām datora lietojumprogrammām, piemēram, spēlēm un drošībai. Spēlēs nejaušie skaitļi nodrošina neparedzamus elementus, uz kuriem spēlētājs var reaģēt, piemēram, izvairīšanās no nejaušas lodes vai kartes izvilkšana no klāja.

Datoru drošībā šifrēšanas algoritmos ir svarīga pseidorandomitāte, kas rada kodus, kurus nedrīkst paredzēt vai uzminēt.



Kas ir PRNG?

TO pseidorandomu skaitļu ģenerators vai PRNG ir jebkura programma vai funkciju , kas nejaušības simulēšanai izmanto matemātiku. To var saukt arī par a DRNG (digitālais nejaušu skaitļu ģenerators) vai DRBG (deterministisks nejaušu bitu ģenerators).

Dažreiz matemātika var būt sarežģīta, taču kopumā PRNG izmantošanai ir nepieciešami tikai divi soļi:



  1. Nodrošiniet PRNG ar patvaļīgu sēklu.
  2. Pieprasiet nākamo izlases numuru.

Sēklas vērtība ir “sākuma punkts” nejaušu skaitļu izveidošanai. Vērtība tiek izmantota skaitļu aprēķināšanai. Ja mainās sēklas vērtība, mainās arī ģenerētie skaitļi, un viena sēklas vērtība vienmēr rada vienādus skaitļus. Šī iemesla dēļ skaitļi nav īsti nejauši, jo patieso nejaušību nekad nevarēja izveidot no jauna.

Pašreizējais laiks bieži tiek izmantots kā unikāla sēklas vērtība. Piemēram, ja ir 5. marts, 2018. gads plkst. 17.03. un 7.01324 sekundes pēc UTC, ko var izteikt kā veselu skaitli. Šis precīzs laiks vairs nekad neatkārtojas, tāpēc PRNG ar šo sēklu vajadzētu radīt unikālu nejaušu skaitļu kopu.

Piezīme

Spēja reproducēt nejauši ģenerētu secību var būt noderīga. Akadēmiskās lietojumprogrammās simulācijai var ģenerēt lielu nejaušu vērtību secību, pēc tam precīzi reproducēt, lai vēlāk veiktu sīkāku analīzi. Kā vēl viens piemērs: datorspēlēs, ja spēlētājs ielādē saglabātu spēli, visi “nejaušie” notikumi var būt tādi paši kā tad, ja spēle nekad neapstājas. Tādā veidā spēlētājs nevar atkārtoti ielādēt vienu un to pašu spēli, lai mēģinātu gūt labāku veiksmi.

Kā ģenerēt pseidorandomālos skaitļus

Tālāk ir minēti daži veidi, kā kopējās programmās un programmēšanas valodās varat izveidot pseidonomanta numuru.

Windows komandu uzvedne

Pie Windows komandu uzvedne vai pakešdatnē - īpašais vides mainīgais % RANDOM% rada pseidorandomu skaitli no 0 līdz 32767, kas iesēts ar komandu uzvednes palaišanas laiku.

echo 'So %RANDOM%!'
'So 27525!'

Lai izveidotu pakešfailu, kas ģenerē nejaušu skaitli no 1 līdz 100:

copy con sorandom.bat echo off set /a myrand=%RANDOM%*100/32768+1 echo The number I was thinking of was %myrand%. Did you get it right?

Nospiediet Ctrl + Z un Enter lai saglabātu pakešfailu. Pēc tam izpildiet failu:

sorandom
The number I was thinking of was 91. Did you get it right?

Windows PowerShell

The Get-Random cmdlet ģenerē nejaušu skaitli no 0 līdz 2 147 483 647 (neparakstītā maksimālā vērtība) 32 bitu vesels skaitlis).

Get-Random
1333190525

Cmdlet izmanto vairākas iespējas, piemēram, minimālo un maksimālo vērtību. Vērtības ir noapaļotas uz leju, tāpēc, lai izveidotu skaitli no 1 līdz 100, iestatiet maksimālo vērtību 101:

Get-Random -Minimum 1 -Maximum 101
99

Microsoft Excel

In Excel izklājlapu , formula = RAND () ģenerē nejaušu skaitli no 0 līdz 1. Piemēram, ja iezīmējat šūnu un ievadāt = RAND () , šūna ģenerē skaitli, kas mainās ikreiz, kad lapa tiek pārrēķināta.

RAND () izlases funkcija programmā Microsoft Excel

Šī metode darbojas arī citās izklājlapu lietojumprogrammās, tostarp LibreOffice Calc un Google izklājlapas.

Programmēšanas valodās

Lielākajai daļai programmēšanas valodu ir PRNG funkcijas. Šeit ir daži izplatīti piemēri:

C

Iekš C programmēšanas valoda , PRNG funkcijas ir definētas standarta bibliotēkā, stdlib . Izplatītais veids, kā sēt nejaušo ģeneratoru, ir laiks() funkcija, deklarēta laiks.h . Radītais skaitlis ir starp 0 un konstante RAND_MAX , sistēmai raksturīgs vesels skaitlis garantē vismaz 32767.

#include #include #include void main () { srand(time(NULL)); /* seed the generator */ int rand1 = rand(); /* a pseudorandom integer between 0 and RAND_MAX */ printf('Random number between 0 and %d: %d
', RAND_MAX, (int)rand1); /* Or, within a specific range: */ int min = 0; int max = 100; float rand2 = (float)rand() * max / RAND_MAX + 1; int round = (int)rand2; printf('Random number between %d and %d: %d (%f)
', min, max, round, rand2); return; }

Izeja:

Random number between 0 and 2147483647: 1789080047 Random number between 0 and 100: 74 (74.369179)

C ++

In C ++ :

#include #include #include int main () { srand(time(NULL)); std::cout << 'Random number between 0 and ' << RAND_MAX << ': ' << rand() << '
' << 'Random number between 1 and 100: ' << (rand() % 100) + 1 << std::endl; return 0; }

Izeja:

Random number between 0 and 2147483647: 126569208 Random number between 1 and 100: 9

Python 3

The nejaušs modulis Python piedāvā dažādas funkcijas nejaušu skaitļu ģenerēšanai. Šajā piemērā mēs izmantojam trīs dažādas metodes, lai atrastu nejaušu veselu skaitli diapazonā.

import random from datetime import datetime random.seed(datetime.now()) print('Random number in range [0,1): ', random.random()) # Within a range. These all do the same thing: print('Random number between 1 and 100: ', round(random.random() * 100) + 1) print('Random number between 1 and 100: ', random.randrange(1, 101)) print('Random number between 1 and 100: ', random.randint(1, 100))

Izeja:

Random number in range [0,1): 0.05137418896158319 Random number between 1 and 100: 27 Random number between 1 and 100: 80 Random number between 1 and 100: 80

Perl 5

In Perl :

srand(time); # changes once per second print 'Random number in range [0,1): ', rand(), '
'; print 'Random number in range [1, 100]: ', int(rand(101)), '
';

Izeja:

Random number in range [0,1): 0.691379946963028 Random number in range [0, 100]: 82

JavaScript

console.log('Random number in range [0,1): ' + Math.random()); console.log('Random number in range [1,100]: ' + Math.floor(Math.random() * 101));

Skatiet izvadi tīmekļa pārlūkprogrammas JavaScript konsolē (piemēram, Firefox nospiediet Ctrl + Shift + TO ):

Random number in range [0,1): 0.305008216755414 Random number in range [1,100]: 8
Piezīme:

Nav iespējams sēklas Math.random () funkcija JavaScript. Ja jums ir nepieciešams izturīgs PRNG JavaScript, pārbaudiet labāki nejauši skaitļi JavaScript vietnē GitHub.

PRNG piemērs: JavaScript logrīks

Izmantojot zemāk esošo logrīku, jūs varat sūtīt PRNG un izmantot to nejaušu skaitļu ģenerēšanai.

Katru reizi, kad jūs ģenerējat nejaušu skaitli no savas dotās sēklas, tā nobīde palielinās par 1. Pirmais sēklas ģenerētais skaitlis ir nobīdījis nulli, otrais - 1. utt. Ģenerators attiecīgajai sēklai un nobīdei vienmēr ražo to pašu skaitli. .

Lai izveidotu unikālu sēkli, laukā ievadiet visu nepieciešamo.

Izmantojiet pogu Ģenerēt, lai iegūtu nākamo nejaušo skaitli, izmantojot šo sēklu, un palieliniet nobīdi.

Izmantojiet pogu Atiestatīt, lai atiestatītu nobīdi uz nulli.

Ievadiet pielāgotu sēklu (skaitli vai frāzi):

Ģenerēt! skaits, kas iegūts no sēklām :

Atiestatīt sēklu nobīdi (pašlaik 0 )

Šis logrīks izmanto Johannes Baagøe atvērtais avots PRNG skripti, Alea.js un Mash.js .