Php պատահական թիվ 1-ից մինչև 10: Ինչ նորություն կա PHP7.1-ում. պատահական թվերի ստեղծում: Պատահական թվեր JavaScript-ում

Ինձ արդեն մի քանի անգամ հարցրել են, թե ինչպես եմ պատահական մեջբերումներ անում իմ կայքում «Խելացի գնանշումներ» բլոկում: Հաջորդը, ինձ հաջողվեց պարզել, որ այստեղ խնդիրն այն է, որ մարդիկ չեն հասկանում, թե ինչպես կարելի է PHP-ում զանգվածից պատահական տարր դուրս բերել: Խնդիրը պարզ է, բայց, այնուամենայնիվ, քանի որ հարցեր են ծագում, դրանց պետք է պատասխանել։

Ես ձեզ անմիջապես կտամ կոդը: Ենթադրենք, կա մի զանգված՝ չակերտների հավաքածուով։ Եվ դուք պետք է ընտրեք դրանցից մեկը պատահական և թողարկեք.

Հիմնական կետը պատահական թիվ ստանալն է: Մնում է միայն ճիշտ սահմաններ դնել: Եթե ​​Ձեզ անհրաժեշտ է զանգվածի ողջ երկարությամբ պատահական տարր ընտրել, ապա այն 0-ից մինչև (զանգվածի երկարությունը հանած 1): Եվ հետո պարզապես զանգվածից մի տարր հանեք՝ ստացված պատահական ինդեքսով:

Ինչ վերաբերում է չակերտներով առաջադրանքին, ապա ավելի լավ է դրանք պահել տվյալների բազայում։ Սկզբունքորեն, եթե կայքը շատ պարզ է, ապա այն կարելի է անել տեքստային ֆայլում։ Բայց եթե տվյալների բազայում, ապա ավելի լավ է SQL հարցումում օգտագործել RAND() և LIMIT, որպեսզի անմիջապես ստանաք մեկ և պատահական մեջբերում տվյալների բազայից։

Պատահական թիվ ստեղծելու համար կարող եք օգտագործել PHP rand() կամ mt_rand() ֆունկցիաները: Պատահական թվեր օգտագործելու պահանջը հաճախ առաջանում է պրակտիկայում՝ փոփոխականներ, ֆայլեր անվանելու, հիմնական տեղեկատվություն ստեղծելու և անվտանգությունն ապահովելու համար:

Պատահականություն և եզակիություն

PHP պատահական ֆունկցիան գալիս է երկու տարբերակով՝ rand() և mt_rand(): Ենթադրվում է, որ առաջին դեպքում ալգորիթմն ավելի պարզ է և առաջացնում է կեղծ պատահական թվեր։ Երկրորդ տարբերակն ունի ավելի արագ ալգորիթմ և հայտնի մաթեմատիկական բնութագրեր։ Շատ դեպքերում, երբ անհրաժեշտ է պատահական համար ստանալ, կարող եք օգտագործել PHP պատահական զանգերի շարք և ստանալ թվերի եզակի համադրություն:

Եթե ​​հիմք ընդունեք 1-ից 26-ը կամ 1-ից մինչև 32 թվերը և ստացեք դրանք պատահականության սկզբունքով, կարող եք հիմնական տեղեկատվությունը ձևավորել որպես լատիներեն կամ կիրիլիցա տառերի հաջորդականություն: Այս դեպքում PHP պատահականությունը այբբենական տեղեկատվության հաջորդականություն ստեղծելու միջոց է, օրինակ՝ կապի ուղիների կամ ալգորիթմների փորձարկման նպատակով:

Պատահական թիվը հազվադեպ է եզակի, քանի որ այն կարող է հայտնվել մի քանի անգամ՝ ըստ պատահական փոփոխականի բաշխման օրենքի: Բայց եթե համատեղեք, մասնավորապես, JavaScript լեզվի ստատիկ փոփոխականը PHP & Math.random, կարող եք ստանալ իրական եզակի պատահական թիվ, որը ժամանակի ընթացքում չի կրկնվի։

Օգտագործելով ժամանակի գործառույթը

Ժամանակի ֆունկցիան՝ և՛ PHP, և՛ JavaScript, թույլ է տալիս ձևավորել թվերի եզակի համակցություններ, հազվադեպ, երբ բավական մեծ թվով իրադարձություններ կարող են տեղի ունենալ ժամանակի մեկ կետում, և պատահական փոփոխականը կկրկնվի:

Կիրառելով PHP պատահականությունը վայրկյանների կամ միլիվայրկյանների միջակայքում հնարավոր արժեքների մեծ տիրույթում, հնարավոր է ստանալ թվերի կամ տառերի եզակի պատահական համակցություններ: Էլ ինչ?

Համատեղելով ժամանակի ֆունկցիայի արժեքը, հաջորդաբար աճող թիվը և PHP պատահականությունը, դուք կարող եք ապահովել հաճախորդի և սերվերի հաղորդակցման ուղիների հուսալի անվտանգությունը, ստեղծել փոփոխականների եզակի կոդեր և առաջացնել անկանխատեսելի իրադարձություններ ալգորիթմներում:

PHP պատահական թվերի գեներատորը գերազանց լուծում է առաջադրանքների մեծ մասի համար, հատկապես, երբ ձեզ անհրաժեշտ է արագորեն բարձրորակ արդյունքներ ստանալ նվազագույն ջանքերով: Օգտագործելով rand() և mt_rand ֆունկցիաները հաջորդաբար աճող թվերի շարքերի կամ ժամանակային արժեքների հետ համատեղ, թույլ է տալիս ստանալ պատահական թվեր՝ և՛ կրկնվող արժեքներով, և՛ եզակի:

Նախաձեռնում է պատահական թվերի գեներատորը: Շարահյուսություն:

Void srand (int seed)

Նախաձեռնում է պատահական թվերի գեներատորը սերմի արժեքով:

Srand ((կրկնակի) microtime () * 1000000);
$պատահական = rand();
echo $ պատահական;

ԳԵՏՐԱՆԴՄԱՔՍ

Վերադարձնում է ամենամեծ հնարավոր պատահական թիվը: Շարահյուսություն:

Int getrandmax ()

Այս ֆունկցիան վերադարձնում է առավելագույն արժեքը, որը կարելի է ստանալ՝ օգտագործելով rand() պատահական թվերի ստեղծման ֆունկցիան։

Սովորաբար դա 32767 է

Պատահական թիվ է առաջացնում: Շարահյուսություն:

Int rand ()

Երբ կանչվում է ընտրովի min և max պարամետրերով, այս ֆունկցիան առաջացնում է պատահական թվեր մինչև այդ պարամետրերը ներառելով: Եթե ​​min և max պարամետրերը բացակայում են, վերադարձվում է 0-ից մինչև RAND_MAX տատանվող թիվ:

Որպեսզի այս ֆունկցիան ճիշտ աշխատի, նախքան այն օգտագործելը, անհրաժեշտ է նախաստորագրել պատահական թվերի գեներատորը srand() ֆունկցիայով։

lcg_value()

LCG կեղծ պատահական թվերի գեներատոր (PHP 4, PHP 5)

Նկարագրություն:

Float lcg_value (անվավեր)

lcg_value()-ը վերադարձնում է կեղծ պատահական թիվ (0, 1): Ֆունկցիան միավորում է երկու գեներատորներ 2^31 - 85 և 2^31 - 249 ժամանակահատվածում:

mt_getrandmax()

Ցույց է տալիս ամենամեծ հնարավոր պատահական արժեքը (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Նկարագրություն:

Int mt_getrandmax (անվավեր)

Ցույց է տալիս առավելագույն արժեքը, որը կարող է վերադարձվել mt_rand()-ի կողմից

mt_rand ()

Առաջացնում է լավագույն պատահական արժեքը (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Նկարագրություն:

int mt_rand ()

Պատահական թվերի գեներատորների շատ ավելի հին տարբերակներ ունեն կասկածելի բնութագրեր և դանդաղ են: Լռելյայնորեն, PHP-ն օգտագործում է rand() ֆունկցիան՝ պատահական թվեր ստեղծելու համար։ Mt_rand() ֆունկցիան լավ փոխարինում է: Այն օգտագործում է պատահական թվերի գեներատոր, որը 4 անգամ ավելի արագ է, քան rand()-ը և օգտագործում է Mersenne Twister-ը։

Զանգված առանց ընտրովի min և max արգումենտների, mt_rand() վերադարձնում է կեղծ պատահական արժեք, որը տատանվում է 0-ից RAND_MAX-ի միջև: Եթե ​​Ձեզ անհրաժեշտ է ստանալ, օրինակ, պատահական արժեքներ 5-ի և 15-ի միջև ներառյալ, փնտրեք mt_rand (5, 15):

mt_rand() օգտագործման օրինակ

Այս օրինակը գործարկելու արդյունքը կլինի այսպիսին.

1604716014
1478613278
6

Մեկնաբանություն

Նշում. 3.0.7-ին նախորդող տարբերակներում ֆունկցիայի երկրորդ պարամետրը նշում էր թվերի տիրույթը: Օրինակ, այս տարբերակներում 5-ից 15-ի միջև պատահական թվեր ստանալու համար անհրաժեշտ է նշել mt_rand(5, 11) ֆունկցիան:

mt_srand ()

Սահմանում է պատահական թվերի լավագույն գեներատորի սկզբնական արժեքը (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Նկարագրություն:

Void mt_srand()

Սահմանում է պատահական թվերի գեներատորի սկզբնական արժեքը՝ օգտագործելով seed-ը: PHP 4.2.0-ի դրությամբ սերմը կամընտիր է, և պատահական արժեքների լռելյայն կարգավորումները բաց են թողնվել:

mt_srand() օգտագործման օրինակ

Նշում. PHP 4.2.0-ի դրությամբ այլևս անհրաժեշտ չէ պատահական թվերի գեներատորը սկզբնավորել srand()-ով կամ mt_srand(-ով), քանի որ դա այժմ կատարվում է ավտոմատ կերպով:

Տեխնիկապես «պատահական թվերի գեներատոր» տերմինը անհեթեթություն է, քանի որ թվերն իրենք պատահական չեն: Օրինակ՝ 100-ը պատահական թիվ է։ Ինչ վերաբերում է 25-ին: Այս տերմինը իրականում նշանակում է, որ այն ստեղծում է պատահական թվերի հաջորդականություն: Սա ավելի բարդ հարց է առաջացնում՝ ի՞նչ է պատահական թվերի հաջորդականությունը: Միակ ճիշտ պատասխանը. պատահական թվերի հաջորդականությունը այն հաջորդականությունն է, որում բոլոր տարրերը կապ չունեն: Այս սահմանումը հանգեցնում է պարադոքսի, որ ցանկացած հաջորդականություն կարող է լինել կամ պատահական կամ ոչ պատահական, կախված նրանից, թե ինչպես է ստացվում հաջորդականությունը: Օրինակ՝ թվերի հետևյալ տողը
1 2 3 4 5 6 7 8 9 0
ստացվել է ստեղնաշարի վերին գիծը հերթականությամբ մուտքագրելով, ուստի հաջորդականությունը չի կարող պատահականորեն առաջացած համարվել: Բայց ի՞նչ, եթե տակառից թենիսի համարակալված գնդակները հանելիս նույն հաջորդականությունը ստանաք: Այս դեպքում դա արդեն պատահականորեն առաջացած հաջորդականություն է։ Այս օրինակը ցույց է տալիս, որ հաջորդականության պատահականությունը կախված է նրանից, թե ինչպես է այն ստացվել, և ոչ թե բուն հաջորդականությունից:

Հիշեք, որ համակարգչի կողմից ստեղծված թվերի հաջորդականությունը դետերմինիստական ​​է. յուրաքանչյուր թիվ, բացի առաջինից, կախված է իրենից առաջ եղած թվերից: Տեխնիկապես դա նշանակում է, որ համակարգչի կողմից կարող է ստեղծվել միայն թվերի գրեթե պատահական հաջորդականություն, այսինքն. իրականում դրանք իսկապես պատահական չեն: Այնուամենայնիվ, սա բավարար է առաջադրանքների մեծ մասի համար և պարզության համար նման հաջորդականությունները կկոչվեն պատահական: Մի շատ հետաքրքիր մեթոդ մշակվել է Ջոն ֆոն Նեյմանի կողմից. այն հաճախ կոչվում է արմատի միջին քառակուսի: Այս մեթոդով նախորդ պատահական թիվը քառակուսի է դրվում, այնուհետև արդյունքից հանվում են միջին թվանշանները: Օրինակ, եթե դուք ստեղծում եք երեք թվանշաններով թվեր, իսկ նախորդ թիվը 121 էր, ապա արդյունքի քառակուսումը տալիս է 14641 արդյունք: Միջին երեք նիշերը քառակուսացնելուց ստացվում է հաջորդ պատահական թիվը՝ 464: Այս մեթոդի թերությունն այն է, որ այն ունի շատ կարճ կրկնության շրջան, որը կոչվում է ցիկլ: Այդ իսկ պատճառով այսօր այս մեթոդը չի կիրառվում։ Պատահական թվերի ստեղծման ժամանակակից մեթոդները շատ ավելի բարդ են:

Պատահական թվեր PHP-ում

PHP-ն ունի երկու խումբ ֆունկցիաներ՝ պատահական թվերի հետ աշխատելու համար։ Զուտ արտաքինից դրանք կարելի է տարբերել mt_ նախածանցով խմբերից մեկի բոլոր ֆունկցիաների համար։

Հնացած հատկանիշներ
ռանդի ֆունկցիան Վերադարձնում է ամբողջ թիվ զրոյի և RAND_MAX արժեքի միջև (որը 32767 է): Կարող է ունենալ երկու կամընտիր ամբողջ թվային պարամետր. եթե դրանք նշված են, պատահական թիվ է ստեղծվում առաջին պարամետրից երկրորդը:

Echo rand (); էխո ռանդ (1100); // Տվեք պատահական թիվ 1-ից մինչև 100

Ֆունկցիան srand. Նշում է պատահական թվերի հաջորդականությունը, որոնք արտադրվում են ռանդի ֆունկցիայի կողմից: Այն ունի մի ամբողջ պարամետր. այս պարամետրի տարբեր արժեքների համար rand-ը կստեղծի թվերի տարբեր հաջորդականություններ: Srand ֆունկցիան պետք է կանչել միայն մեկ անգամ՝ rand ֆունկցիայի բոլոր կանչերից առաջ: Օգտագործման օրինակ.

Սրանդ (1288); // Նախաձեռնել պատահական թվերի գեներատորը for($i=0; $iquery("SELECT COUNT(*) AS count FROM quotes");
եթե ($ տող = $sth->fetchRow()) (
$count = $ տող;
) ուրիշ (
die ($row->getMessage());
}
$պատահական = mt_rand(0, $count - 1);
$sth = $dbh-> հարցում ("SELECT quote FROM quotes LIMIT $պատահական,1");
մինչդեռ ($ տող = $sth->fetchRow()) (
տպել $ տող .

«\n»;
}

Կոդի այս հատվածը որոշում է աղյուսակի տողերի ընդհանուր թիվը, այդ միջակայքից ստեղծում է պատահական թիվ, այնուհետև օգտագործում է LIMIT $պատահական,1՝ աղյուսակից մեկ տող ընտրելու համար՝ սկսած $պատահական դիրքից: MySQL 3.23 կամ ավելի բարձր տարբերակում հնարավոր է այլընտրանքային տարբերակ.

$sth = $dbh-> հարցում ("SELECT quote FROM quotes ORDER BY RAND() LIMIT 1");
մինչդեռ ($ տող = $sth->fetchRow()) (
տպել $ տող . «\n»;
}

Այս դեպքում MySQL-ը նախ պատահականացնում է տողերը, իսկ հետո վերադարձնում է առաջին տողը։