Ģenerē nejaušu skaitli. Sintakse

Lai ģenerētu nejaušu skaitli, varat izmantot PHP rand() vai mt_rand() funkciju. Prasība izmantot nejaušus skaitļus bieži rodas praksē mainīgo, failu nosaukšanai, galvenās informācijas veidošanai un drošības nodrošināšanai.

Nejaušība un unikalitāte

PHP izlases funkcijai ir divi varianti: rand () un mt_rand (). Tiek uzskatīts, ka pirmajā gadījumā algoritms ir vienkāršāks un ģenerē pseidogadījuma skaitļus. Otrajai iespējai ir ātrāks algoritms un labi zināmi matemātiskie raksturlielumi. Vairumā gadījumu, kad jums ir nepieciešams iegūt nejaušu numuru, varat izmantot PHP izlases zvanu sēriju un iegūt unikālu ciparu kombināciju.

Ja par pamatu ņemat skaitļus no 1 līdz 26 vai no 1 līdz 32 un iegūstat tos nejauši, galveno informāciju varat veidot kā latīņu vai kirilicas burtu secību. Šajā gadījumā PHP izlases veids ir veids, kā ģenerēt alfabētiskās informācijas secību, piemēram, lai pārbaudītu sakaru kanālus vai algoritmus.

Nejaušs skaitlis reti ir unikāls, jo tas var parādīties vairākas reizes saskaņā ar nejauša lieluma sadalījuma likumu. Bet, ja jo īpaši apvienojat JavaScript valodas statisko mainīgo PHP & Math.random, varat iegūt reālu unikālu nejaušu skaitli, kas laika gaitā neatkārtosies.

Laika funkcijas izmantošana

Laika funkcija gan PHP, gan JavaScript ļauj veidot unikālas skaitļu kombinācijas, reti kad vienā brīdī var notikt pietiekami liels notikumu skaits un nejaušais mainīgais tiks atkārtots.

Izmantojot PHP nejaušību sekunžu vai milisekunžu diapazonā lielā iespējamo vērtību diapazonā, ir iespējams iegūt unikālas nejaušas ciparu vai burtu kombinācijas. Kas vēl?

Apvienojot laika funkcijas vērtību, secīgi augošu skaitli un PHP nejaušību, jūs varat nodrošināt uzticamu klienta un servera sakaru kanālu drošību, izveidot unikālus mainīgo kodus un ģenerēt neparedzamus notikumus algoritmos.

PHP izlases skaitļu ģenerators ir lielisks risinājums lielākajai daļai uzdevumu, it īpaši, ja nepieciešams ātri iegūt augstas kvalitātes rezultātus ar minimālu piepūli. Izmantojot funkcijas rand() un mt_rand kopā ar secīgi augošām skaitļu sērijām vai laika vērtībām, varat iegūt nejaušus skaitļus, kas atkārtojas vērtībās un ir unikāli.

Tehniski termins "nejaušo skaitļu ģenerators" ir muļķīgs, jo paši skaitļi nav nejauši. Piemēram, vai 100 ir nejaušs skaitlis? Kā ar 25? Šis termins patiesībā nozīmē, ka tas rada skaitļu secību, kas parādās nejauši. Tas rada sarežģītāku jautājumu: kas ir nejaušu skaitļu secība? Vienīgā pareizā atbilde: nejaušu skaitļu secība ir secība, kurā visi elementi nav saistīti. Šī definīcija noved pie paradoksa, ka jebkura secība var būt nejauša vai nejauša atkarībā no tā, kā secība tiek iegūta. Piemēram, šāda skaitļu virkne
1 2 3 4 5 6 7 8 9 0
tika iegūts, secībā ierakstot tastatūras augšējo rindiņu, tāpēc secību nevar uzskatīt par nejauši ģenerētu. Bet ko darīt, ja jūs iegūstat tādu pašu secību, kad izņemat numurētās tenisa bumbiņas no mucas. Šajā gadījumā tā jau ir nejauši ģenerēta secība. Šis piemērs parāda, ka secības nejaušība ir atkarīga no tā, kā tā tika iegūta, nevis no pašas secības.

Atcerieties, ka datora ģenerēta skaitļu secība ir deterministiska: katrs skaitlis, izņemot pirmo, ir atkarīgs no skaitļiem pirms tā. Tehniski tas nozīmē, ka dators var ģenerēt tikai gandrīz nejaušu skaitļu secību, t.i. patiesībā tie nav īsti nejauši. Tomēr ar to pietiek lielākajai daļai uzdevumu, un vienkāršības labad šādas secības tiks sauktas par nejaušām. Vienu ļoti interesantu metodi izstrādāja Džons fon Neimans; to bieži sauc par vidējo kvadrātu. Izmantojot šo metodi, iepriekšējais nejaušais skaitlis tiek izlikts kvadrātā, un pēc tam no rezultāta tiek iegūti vidējie cipari. Piemēram, ja veidojat skaitļus ar trīs cipariem, un iepriekšējais skaitlis bija 121, tad to kvadrātā iegūstat rezultātu 14641. Izolējot vidējos trīs ciparus, tiek iegūts nākamais nejaušības skaitlis 464. Šīs metodes trūkums ir tāds, ka tai ir ļoti īss atkārtošanās periods, ko sauc par ciklu. Šī iemesla dēļ šī metode mūsdienās netiek izmantota. Mūsdienu metodes nejaušu skaitļu ģenerēšanai ir daudz sarežģītākas.

Nejauši skaitļi PHP

PHP ir divas funkciju grupas darbam ar nejaušiem skaitļiem. Tīri ārēji tos var atšķirt pēc mt_ prefiksa visām vienas grupas funkcijām.

Novecojušas funkcijas
rand funkcija Atgriež veselu skaitli starp nulli un RAND_MAX vērtību (kas ir 32767). Var būt divi neobligāti veselu skaitļu parametri – ja tie ir norādīti, no pirmā parametra uz otro tiek ģenerēts nejaušs skaitlis.

Echo rand(); atbalss rand (1100); // Izsniedziet nejaušu skaitli no 1 līdz 100

Funkcija srand. Norāda nejaušo skaitļu secību, ko rada randu funkcija. Tam ir viss parametrs - dažādām šī parametra vērtībām rands radīs dažādas skaitļu secības. Funkcija srand ir jāizsauc tikai vienu reizi pirms visiem rand funkcijas izsaukumiem. Lietošanas piemērs:

Srand(1288); // Inicializēt nejaušo skaitļu ģeneratoru for($i=0; $i

Galvenais ir iegūt nejaušu skaitli. Viss, kas jums jādara, ir noteikt pareizās robežas. Ja jums ir jāizvēlas nejaušs elements visā masīva garumā, tad tas ir no 0 līdz (masīva garums mīnus 1). Un pēc tam vienkārši izvelciet elementu no masīva ar iegūto nejaušības indeksu.

Kas attiecas uz uzdevumu ar citātiem, labāk tos uzglabāt datu bāzē. Principā, ja vietne ir ļoti vienkārša, tad to var izdarīt teksta failā. Bet, ja datu bāzē, tad SQL vaicājumā labāk izmantot RAND() un LIMIT, lai uzreiz saņemtu vienu un nejaušu citātu no datu bāzes.

Inicializē nejaušo skaitļu ģeneratoru. Sintakse:

Nederīga sēkla (int sēklas)

Inicializē nejaušo skaitļu ģeneratoru ar sākuma vērtību.

Srand((dubultais) mikrolaiks()*1000000);
$random = rand();
echo $random;

GETRANDMAX

Atgriež lielāko iespējamo nejaušo skaitli. Sintakse:

Int getrandmax()

Šī funkcija atgriež maksimālo vērtību, ko var iegūt, izmantojot nejaušo skaitļu ģenerēšanas funkciju rand().

Parasti tas ir 32767

Ģenerē nejaušu skaitli. Sintakse:

Int rand()

Izsaucot ar izvēles min un max parametriem, šī funkcija ģenerē nejaušu skaitu līdz šiem parametriem ieskaitot. Ja trūkst minimālo un maksimālo parametru, tiek atgriezts skaitlis no 0 līdz RAND_MAX.

Lai šī funkcija darbotos pareizi, pirms tās izmantošanas ir jāinicializē nejaušo skaitļu ģenerators ar funkciju srand().

lcg_value()

LCG pseidogadījuma skaitļu ģenerators (PHP 4, PHP 5)

Apraksts:

Float lcg_value (nederīgs)

lcg_value() atgriež pseidogadījuma skaitli diapazonā (0, 1). Funkcija apvieno divus ģeneratorus ar 2^31 - 85 un 2^31 - 249 periodā.

mt_getrandmax()

Parāda lielāko iespējamo nejaušības vērtību (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Apraksts:

Int mt_getrandmax (nederīgs)

Parāda maksimālo vērtību, ko var atgriezt mt_rand()

mt_rand()

Ģenerē labāko nejaušības vērtību (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Apraksts:

int mt_rand()

Daudzām vecākām nejaušo skaitļu ģeneratoru versijām ir apšaubāmas īpašības un tās darbojas lēni. Pēc noklusējuma PHP izmanto funkciju rand(), lai ģenerētu nejaušus skaitļus. Funkcija mt_rand () ir labs aizstājējs. Tas izmanto nejaušo skaitļu ģeneratoru, kas ir 4 reizes ātrāks nekā rand () un izmanto Mersenne Twister.

Izsaukts bez izvēles min un max argumentiem, mt_rand() atgriež pseidogadījuma vērtību diapazonā no 0 līdz RAND_MAX. Ja jums ir nepieciešams iegūt, piemēram, nejaušas vērtības no 5 līdz 15 ieskaitot, meklējiet mt_rand (5, 15).

mt_rand() izmantošanas piemērs

Šī piemēra izpildes rezultāts būs apmēram šāds:

1604716014
1478613278
6

komentēt

Piezīme. Versijās, kas vecākas par 3.0.7, otrais funkcijas parametrs noteica skaitļu diapazonu. Piemēram, lai šajās versijās iegūtu nejaušus skaitļus no 5 līdz 15, ir jānorāda funkcija mt_rand(5, 11).

mt_srand()

Iestata labākā nejaušo skaitļu ģeneratora sākotnējo vērtību (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Apraksts:

Nederīgs mt_srand()

Iestata nejaušo skaitļu ģeneratora sākotnējo vērtību, izmantojot sēklu. Sākot ar PHP 4.2.0, sēkla nav obligāta, un nejaušo vērtību noklusējuma iestatījumi ir izlaisti.

mt_srand() izmantošanas piemērs

Piezīme. Sākot ar PHP 4.2.0, vairs nav nepieciešams inicializēt nejaušo skaitļu ģeneratoru ar srand() vai mt_srand(), jo tas tagad tiek darīts automātiski.

Uzdevums
Jums ir jāģenerē nejaušs skaitlis ciparu diapazonā.

Risinājums
Funkcija mt_rand() ir paredzēta šim nolūkam:

// nejaušs skaitlis starp $upper un $lower, ieskaitot
$gadījuma_skaitlis = mt_rand($apakšējais, $augšējais);

Diskusija
Nejaušo skaitļu ģenerēšana ir noderīga, ja ekrānā ir jāparāda nejaušs attēls, nejauši jāpiešķir spēles sākuma punkts, datubāzē jāizvēlas nejaušs ieraksts vai jāģenerē unikāls sesijas identifikators. Lai ģenerētu nejaušu skaitli intervālā starp diviem punktiem, funkcijai mt_rand () ir jānodod divi argumenti:

$nejaušs_skaitlis = mt_rand(1, 100);

Mt_rand() izsaukšana bez argumentiem atgriež skaitli no nulles līdz maksimālajam nejaušības skaitlim, ko atgriež mt_getrandmax(). Datoram ir grūti ģenerēt patiesi nejaušu skaitli. Viņš daudz labāk spēj metodiski ievērot norādījumus un nav tik labs, ja viņam tiek prasīta spontāna rīcība. Ja jums ir jāpiespiež dators izveidot nejaušu skaitli, jums ir jādod tam noteikta atkārtojamu komandu kopa, un pats atkārtojamības fakts samazina nejaušības sasniegšanu.

PHP ir divi dažādi nejaušo skaitļu ģeneratori: klasiskā funkcija ar nosaukumu rand() un uzlabotā funkcija mt_rand().

MT (Mersenne Twister) ir pseidogadījuma skaitļu ģenerators, kas nosaukts franču mūka un matemātiķa Marina Mersenna vārdā, kurš pētīja pirmskaitļus. Šī ģeneratora algoritms ir balstīts uz šiem pirmskaitļiem. Funkcija mt_rand () ir ātrāka nekā funkcija rand () un rada vairāk nejaušu skaitļu, tāpēc mēs dodam priekšroku pirmajam.

Ja jums ir PHP versija, kas ir vecāka par 4.2, tad pirms funkcijas mt_rand() (vai rand()) izsaukšanas pirmo reizi ir jāinicializē ģenerators ar sākotnējo vērtību, izsaucot mt_srand() (vai srand(). )) funkcija. Sēklas ir skaitlis, ko izlases funkcija izmanto kā pamatu, lai ģenerētu nejaušos skaitļus, ko tā atgriež; tas attiecas uz veidu, kā atrisināt iepriekš minēto dilemmu – atkārtojamību pret nejaušību.

Kā sākotnējo vērtību, kas mainās ļoti ātri un ar zemu atkārtojamības iespējamību (šīs īpašības jāraksturo ar labu sākotnējo vērtību), varat ņemt vērtību, ko atgriež augstas precizitātes laika funkcija microtime(). Pietiek vienreiz inicializēt ģeneratoru. PHP 4.2 un jaunākas versijas automātiski apstrādā inicializāciju, taču, ja sākotnējā vērtība tiek iestatīta manuāli pirms pirmā mt_rand() izsaukuma, PHP to neaizstāj ar savu sākotnējo vērtību.

Ja datubāzē ir jāatlasa nejaušs ieraksts, vienkāršākais veids ir vispirms noteikt kopējo tabulas lauku skaitu, atlasīt nejaušu skaitli no šī diapazona un pēc tam vaicāt šai rindai no datu bāzes:

$sth = $dbh->query("SELECT COUNT(*) AS count FROM pēdiņām");
if ($rinda = $sth->fetchRow()) (
$skaits = $rinda;
) cits (
mirst ($row->getMessage());
}
$nejaušs = mt_rand(0, $skaits - 1);
$sth = $dbh->query("IZVĒLĒTIES citātu NO pēdiņām LIMIT $random,1");
while ($row = $sth->fetchRow()) (
drukāt $rindu .

"\n";
}

Šis koda fragments nosaka kopējo tabulas rindu skaitu, ģenerē nejaušu skaitli no šī diapazona un pēc tam izmanto LIMIT $random,1, lai ATLASĪT vienu rindu no tabulas, sākot no pozīcijas $random. MySQL versijā 3.23 vai jaunākā versijā ir iespējama alternatīva opcija:

$sth = $dbh->query("SELECT citātu NO pēdiņām ORDER BY RAND() LIMIT 1");
while ($row = $sth->fetchRow()) (
drukāt $rindu . "\n";
}

Šajā gadījumā MySQL vispirms randomizē rindas un pēc tam atgriež pirmo rindu.