Php tasodifiy soni 1 dan 10 gacha. PHP7.1 da yangilik: tasodifiy sonlarni yaratish. JavaScript-da tasodifiy raqamlar

Mendan bir necha marta veb-saytimda "Aqlli tirnoq" blokida tasodifiy tirnoqlarni qanday qilishim haqida so'rashgan. Keyinchalik, men bu erda muammo odamlarning PHP-da massivdan tasodifiy elementni qanday chiqarishni tushunmasligi bilan bog'liqligini bilib oldim. Vazifa oddiy, ammo shunga qaramay, savollar paydo bo'lganligi sababli ularga javob berish kerak.

Men sizga darhol kodni beraman. Aytaylik, qo'shtirnoqlar to'plamiga ega massiv bor. Va siz ulardan bitta tasodifiy birini tanlashingiz va chiqarishingiz kerak:

Asosiy nuqta tasodifiy raqamni olishdir. Siz qilishingiz kerak bo'lgan yagona narsa - to'g'ri chegaralarni belgilash. Agar siz massivning butun uzunligi bo'ylab tasodifiy elementni tanlashingiz kerak bo'lsa, u 0 dan (massiv uzunligi minus 1) gacha bo'ladi. Va keyin oddiygina tasodifiy indeks bilan massivdan elementni chiqarib oling.

Qo'shtirnoq bilan vazifaga kelsak, ularni ma'lumotlar bazasida saqlash yaxshiroqdir. Printsipial jihatdan, agar sayt juda oddiy bo'lsa, u holda matn faylida amalga oshirilishi mumkin. Ammo agar ma'lumotlar bazasida bo'lsa, SQL so'rovida RAND() va LIMIT dan foydalangan ma'qul, shunda siz darhol ma'lumotlar bazasidan bitta va tasodifiy kotirovka olasiz.

Tasodifiy sonni yaratish uchun siz PHP rand() yoki mt_rand() funksiyasidan foydalanishingiz mumkin. Tasodifiy raqamlardan foydalanish talabi ko'pincha o'zgaruvchilar, fayllarni nomlash, asosiy ma'lumotlarni yaratish va xavfsizlikni ta'minlash uchun amalda paydo bo'ladi.

Tasodifiylik va o'ziga xoslik

PHP tasodifiy funksiyasi ikkita variantda mavjud: rand() va mt_rand(). Birinchi holatda algoritm oddiyroq va psevdor tasodifiy raqamlarni hosil qiladi, deb ishoniladi. Ikkinchi variant tezroq algoritmga va taniqli matematik xususiyatlarga ega. Ko'p hollarda tasodifiy raqamni olishingiz kerak bo'lganda, siz PHP tasodifiy qo'ng'iroqlari seriyasidan foydalanishingiz va raqamlarning noyob kombinatsiyasini olishingiz mumkin.

Agar siz 1 dan 26 gacha yoki 1 dan 32 gacha raqamlarni asos qilib olib, ularni tasodifiy olsangiz, asosiy ma'lumotlarni lotin yoki kirill harflari ketma-ketligi sifatida shakllantirishingiz mumkin. Bunday holda, PHP tasodifiy alifbo ma'lumotlari ketma-ketligini yaratish usulidir, masalan, aloqa kanallari yoki algoritmlarni sinab ko'rish uchun.

Tasodifiy son kamdan-kam hollarda noyobdir, chunki u tasodifiy miqdorning taqsimot qonuniga ko'ra bir necha marta paydo bo'lishi mumkin. Agar siz, xususan, JavaScript tilining statik o'zgaruvchisi PHP & Math.randomni birlashtirsangiz, vaqt o'tishi bilan takrorlanmaydigan haqiqiy noyob tasodifiy raqamni olishingiz mumkin.

Vaqt funksiyasidan foydalanish

Vaqt funksiyasi, ham PHP, ham JavaScript, raqamlarning noyob kombinatsiyasini yaratishga imkon beradi, kamdan-kam hollarda, bir vaqtning o'zida etarlicha ko'p hodisalar sodir bo'lishi mumkin va tasodifiy o'zgaruvchi takrorlanadi.

PHP tasodifiy sekundlar yoki millisekundlar oralig'ida mumkin bo'lgan qiymatlarning katta diapazonida qo'llash orqali raqamlar yoki harflarning noyob tasodifiy kombinatsiyasini olish mumkin. Nima yana?

Vaqt funksiyasining qiymatini, ketma-ket o'sib borayotgan raqamni va PHP tasodifiyligini birlashtirib, siz mijoz va server aloqa kanallarining ishonchli xavfsizligini ta'minlashingiz, o'zgaruvchilar uchun noyob kodlarni yaratishingiz va algoritmlarda oldindan aytib bo'lmaydigan hodisalarni yaratishingiz mumkin.

PHP tasodifiy sonlar generatori ko'p vazifalar uchun ajoyib yechimdir, ayniqsa minimal kuch bilan yuqori sifatli natijalarga tezda erishish kerak bo'lganda. Rand() va mt_rand funktsiyalaridan ketma-ket o'sib boruvchi raqamlar seriyasi yoki vaqt qiymatlari bilan birgalikda foydalanish tasodifiy raqamlarni olish imkonini beradi, ham qiymatlarda takrorlanadigan, ham noyob.

Tasodifiy sonlar generatorini ishga tushiradi. Sintaksis:

Void srand (int urug'i)

Urug' qiymati bilan tasodifiy sonlar generatorini ishga tushiradi.

Srand((juft) microtime()*1000000);
$tasodifiy = rand();
echo $tasodifiy;

GETRANDMAX

Eng katta tasodifiy sonni qaytaradi. Sintaksis:

Int getrandmax()

Bu funksiya rand() tasodifiy sonlar yaratish funksiyasi yordamida olinishi mumkin bo'lgan maksimal qiymatni qaytaradi.

Odatda bu 32767

Tasodifiy son hosil qiladi. Sintaksis:

Int rand()

Ixtiyoriy min va maksimal parametrlar bilan chaqirilganda, bu funksiya shu parametrlarga qadar va shu jumladan tasodifiy son hosil qiladi. Agar min va maks parametrlari etishmayotgan bo'lsa, 0 dan RAND_MAX gacha bo'lgan raqam qaytariladi.

Ushbu funktsiya to'g'ri ishlashi uchun uni ishlatishdan oldin tasodifiy sonlar generatorini srand() funksiyasi bilan ishga tushirishingiz kerak.

lcg_value()

LCG psevdo-tasodifiy raqamlar generatori (PHP 4, PHP 5)

Tavsif:

Float lcg_value (bo'sh)

lcg_value() (0, 1) oraliqda psevdor tasodifiy sonni qaytaradi. Funktsiya bir davrda 2^31 - 85 va 2^31 - 249 bo'lgan ikkita generatorni birlashtiradi.

mt_getrandmax()

Mumkin boʻlgan eng katta tasodifiy qiymatni koʻrsatadi (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Tavsif:

Int mt_getrandmax (bo'sh)

mt_rand() tomonidan qaytarilishi mumkin bo'lgan maksimal qiymatni ko'rsatadi

mt_rand()

Eng yaxshi tasodifiy qiymatni yaratadi (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Tavsif:

int mt_rand()

Tasodifiy sonlar generatorlarining ko'pgina eski versiyalari shubhali xususiyatlarga ega va sekin. Odatiy bo'lib, PHP tasodifiy sonlarni yaratish uchun rand() funksiyasidan foydalanadi. mt_rand() funktsiyasi yaxshi o'rnini egallaydi. U rand() dan 4 baravar tezroq tasodifiy sonlar generatoridan foydalanadi va Mersenne Twister’dan foydalanadi.

Ixtiyoriy min va maks argumentlarsiz chaqirilgan mt_rand() 0 va RAND_MAX oralig'ida bo'lgan psevdo-tasodifiy qiymatni qaytaradi. Masalan, 5 dan 15 gacha bo'lgan tasodifiy qiymatlarni olishingiz kerak bo'lsa, mt_rand (5, 15) ni qidiring.

mt_rand() dan foydalanishga misol

Ushbu misolni ishga tushirish natijasi shunday bo'ladi:

1604716014
1478613278
6

Izoh

Eslatma: 3.0.7 dan oldingi versiyalarda funksiyaning ikkinchi parametri raqamlar oralig'ini ko'rsatdi. Masalan, ushbu versiyalarda 5 dan 15 gacha bo'lgan tasodifiy sonlarni olish uchun siz mt_rand (5, 11) funksiyasini ko'rsatishingiz kerak.

mt_srand()

Eng yaxshi tasodifiy sonlar generatorining boshlang‘ich qiymatini o‘rnatadi (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Tavsif:

Void mt_srand()

Seed yordamida tasodifiy sonlar generatorining boshlang'ich qiymatini o'rnatadi. PHP 4.2.0 dan boshlab, seed ixtiyoriy va tasodifiy qiymatlar uchun standart sozlamalar o'tkazib yuborilgan.

mt_srand() dan foydalanishga misol

Eslatma: PHP 4.2.0 dan boshlab tasodifiy sonlar generatorini srand() yoki mt_srand() bilan ishga tushirish endi shart emas, chunki bu endi avtomatik ravishda amalga oshiriladi.

Texnik jihatdan, "tasodifiy raqamlar generatori" atamasi bema'nilikdir, chunki raqamlarning o'zi tasodifiy emas. Masalan, 100 tasodifiy sonmi? 25-chi? Bu atama aslida nimani anglatadi, u tasodifiy ko'rinadigan raqamlar ketma-ketligini yaratadi. Bu yanada qiyin savol tug'diradi: tasodifiy sonlar ketma-ketligi nima? Yagona to'g'ri javob: tasodifiy sonlar ketma-ketligi barcha elementlar bir-biriga bog'liq bo'lmagan ketma-ketlikdir. Bu ta'rif paradoksga olib keladiki, har qanday ketma-ketlik ketma-ketlik qanday olinishiga qarab tasodifiy yoki tasodifiy bo'lishi mumkin. Masalan, quyidagi raqamlar qatori
1 2 3 4 5 6 7 8 9 0
klaviaturaning yuqori qatorini tartibda terish orqali olingan, shuning uchun ketma-ketlikni tasodifiy yaratilgan deb hisoblash mumkin emas. Ammo raqamlangan tennis to'plarini bochkadan chiqarganingizda bir xil ketma-ketlikni olsangiz-chi. Bunday holda, u allaqachon tasodifiy yaratilgan ketma-ketlikdir. Ushbu misol ketma-ketlikning tasodifiyligi ketma-ketlikning o'ziga emas, balki qanday olinganiga bog'liqligini ko'rsatadi.

Kompyuterda yaratilgan raqamlar ketma-ketligi deterministik ekanligini unutmang: birinchisidan tashqari har bir raqam oldingi raqamlarga bog'liq. Texnik jihatdan bu shuni anglatadiki, faqat kvazi-tasodifiy raqamlar ketma-ketligi kompyuter tomonidan yaratilishi mumkin, ya'ni. aslida ular tasodifiy emas. Biroq, bu ko'pchilik vazifalar uchun etarli va soddaligi uchun bunday ketma-ketliklar tasodifiy deb nomlanadi. Jon fon Neyman tomonidan juda qiziqarli usullardan biri ishlab chiqilgan; u ko'pincha ildiz o'rtacha kvadrat deb ataladi. Bu usulda oldingi tasodifiy son kvadratga olinadi, so'ngra natijadan o'rta raqamlar chiqariladi. Misol uchun, agar siz uchta raqamli raqamlarni yaratayotgan bo'lsangiz va oldingi raqam 121 bo'lsa, natijani kvadratga solish 14641 natijani beradi. O'rtadagi uchta raqamni kvadratga olish keyingi tasodifiy sonni beradi 464. Bu usulning kamchiligi shundaki, u juda qisqa takrorlash davri, tsikl deb ataladi. Shu sababli bugungi kunda bu usul qo'llanilmaydi. Tasodifiy sonlarni yaratishning zamonaviy usullari ancha murakkab.

PHPda tasodifiy raqamlar

PHPda tasodifiy sonlar bilan ishlash uchun ikkita funksiya guruhi mavjud. Sof tashqi tomondan, ularni guruhlardan birining barcha funktsiyalari uchun mt_ prefiksi bilan ajratish mumkin.

Eskirgan xususiyatlar
rand funktsiyasi Nol va RAND_MAX qiymati orasidagi butun sonni qaytaradi (bu 32767). Ikkita ixtiyoriy butun son parametrlariga ega bo'lishi mumkin - agar ular ko'rsatilgan bo'lsa, birinchi parametrdan ikkinchisiga tasodifiy son hosil bo'ladi.

Echo rand(); echo rand(1100); // 1 dan 100 gacha tasodifiy sonni bering

Funktsiya srand. Rand funktsiyasi tomonidan ishlab chiqarilgan tasodifiy sonlar ketma-ketligini belgilaydi. U butun parametrga ega - bu parametrning turli qiymatlari uchun rand turli xil raqamlar ketma-ketligini ishlab chiqaradi. Rand funksiyasiga barcha chaqiruvlardan oldin srand funksiyasi faqat bir marta chaqirilishi kerak. Foydalanish misoli:

Srand (1288); // Tasodifiy sonlar generatorini ishga tushiring ($i=0; $iquery("Tanlash COUNT(*) qo'shtirnoqlardan hisoblash");
agar ($row = $sth->fetchRow()) (
$count = $satr;
) boshqa (
o'lim ($row->getMessage());
}
$tasodifiy = mt_rand(0, $hisob - 1);
$sth = $dbh->query("Qo'shtirnoqlardan LIMIT $tasodifiy,1 iqtibosni tanlang");
while ($row = $sth->fetchRow()) (
$ qatorni chop eting.

"\n";
}

Ushbu kod parchasi jadvaldagi satrlarning umumiy sonini aniqlaydi, shu diapazondan tasodifiy son hosil qiladi va keyin $tasodifiy pozitsiyasidan boshlab jadvaldan bitta qatorni SELECT uchun LIMIT $random,1 dan foydalanadi. MySQL 3.23 yoki undan yuqori versiyalarida muqobil variant mavjud:

$sth = $dbh->query("RAND() LIMIT 1 BO'YICHA ORDER BY qo'shtirnoqlardan iqtibos tanlang");
while ($row = $sth->fetchRow()) (
$ qatorni chop eting. "\n";
}

Bunday holda, MySQL birinchi navbatda qatorlarni tasodifiy qiladi va keyin birinchi qatorni qaytaradi.