შემთხვევითი რიცხვი php-ში. PHP შემთხვევითი ფუნქციის გამოყენება

შემთხვევითი რიცხვის გენერირებისთვის შეგიძლიათ გამოიყენოთ 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 ფუნქციების გამოყენება რიცხვების თანმიმდევრულად მზარდ სერიასთან ან დროის მნიშვნელობებთან ერთად საშუალებას გაძლევთ მიიღოთ შემთხვევითი რიცხვები, როგორც მნიშვნელობებით განმეორებადი, ასევე უნიკალური.

დავალება
თქვენ უნდა შექმნათ შემთხვევითი რიცხვი რიცხვითი დიაპაზონის ფარგლებში.

გამოსავალი
mt_rand() ფუნქცია შექმნილია ამისათვის:

// შემთხვევითი რიცხვი $ზედა და $ქვედა შორის, მათ შორის
$შემთხვევითი_ნომერი = mt_rand($ქვედა, $ზედა);

დისკუსია
შემთხვევითი რიცხვების გენერირება სასარგებლოა, როდესაც გჭირდებათ შემთხვევითი სურათის ჩვენება ეკრანზე, შემთხვევით მინიჭება საწყისი წერტილი თამაშში, აირჩიეთ შემთხვევითი ჩანაწერი მონაცემთა ბაზიდან ან გენერირება უნიკალური სესიის იდენტიფიკატორი. ორ წერტილს შორის ინტერვალში შემთხვევითი რიცხვის გენერირებისთვის, თქვენ უნდა გადასცეთ ორი არგუმენტი mt_rand() ფუნქციას:

$შემთხვევითი_ნომერი = mt_rand(1, 100);

mt_rand()-ის გამოძახება არგუმენტების გარეშე აბრუნებს რიცხვს ნულსა და მაქსიმალურ შემთხვევით რიცხვს შორის, რომელიც დაბრუნებულია mt_getrandmax(-ის მიერ). კომპიუტერისთვის რთულია ჭეშმარიტად შემთხვევითი რიცხვის გენერირება. ის ბევრად უკეთ ახერხებს ინსტრუქციების მეთოდურად შესრულებას და არც ისე კარგია, თუ მას მოეთხოვება სპონტანური მოქმედება. თუ გსურთ აიძულოთ კომპიუტერი აწარმოოს შემთხვევითი რიცხვი, მაშინ თქვენ უნდა მისცეთ მას განმეორებადი ბრძანებების გარკვეული ნაკრები და თვით განმეორებადობის ფაქტი შემთხვევითობის მიღწევას ნაკლებად სავარაუდოს ხდის.

PHP-ს აქვს ორი განსხვავებული შემთხვევითი რიცხვების გენერატორი: კლასიკური ფუნქცია სახელად rand() და უფრო მოწინავე ფუნქცია mt_rand().

MT (Mersenne Twister) არის ფსევდო შემთხვევითი რიცხვების გენერატორი, რომელსაც ფრანგი ბერისა და მათემატიკოსის მარინ მერსენის სახელი ეწოდა, რომელიც სწავლობდა მარტივ რიცხვებს. ამ გენერატორის ალგორითმი ემყარება ამ მარტივ რიცხვებს. mt_rand() ფუნქცია უფრო სწრაფია ვიდრე rand() ფუნქცია და აწარმოებს უფრო შემთხვევით რიცხვებს, ამიტომ უპირატესობას ვანიჭებთ პირველს.

თუ თქვენ გაქვთ PHP-ის ვერსია 4.2-ზე ადრე, მაშინ mt_rand() (ან rand()) ფუნქციის პირველად გამოძახებამდე, თქვენ უნდა მოაწყოთ გენერატორი საწყისი მნიშვნელობით mt_srand() (ან srand(-ის გამოძახებით. )) ფუნქცია. Seed არის რიცხვი, რომელსაც შემთხვევითი ფუნქცია იყენებს, როგორც საფუძველს მის მიერ დაბრუნებული შემთხვევითი რიცხვების გენერირებისთვის; ეს ეხება ზემოხსენებული დილემის გადაჭრის გზას - განმეორებადობა შემთხვევითობის წინააღმდეგ.

როგორც საწყისი მნიშვნელობა, რომელიც იცვლება ძალიან სწრაფად და განმეორებადობის დაბალი ალბათობით (ეს თვისებები უნდა ხასიათდებოდეს კარგი საწყისი მნიშვნელობით), შეგიძლიათ მიიღოთ მაღალი სიზუსტის დროის ფუნქციის microtime() მიერ დაბრუნებული მნიშვნელობა. საკმარისია გენერატორის ინიციალიზაცია ერთხელ. PHP 4.2 და შემდეგ ავტომატურად ამუშავებს ინიციალიზაციას, მაგრამ თუ საწყისი მნიშვნელობა დაყენებულია ხელით mt_rand(-ზე) პირველ გამოძახებამდე, PHP არ ცვლის მას საკუთარი საწყისი მნიშვნელობით.

თუ თქვენ გჭირდებათ შემთხვევითი ჩანაწერის არჩევა მონაცემთა ბაზიდან, უმარტივესი გზაა ჯერ განსაზღვროთ ცხრილის ველების მთლიანი რაოდენობა, აირჩიოთ შემთხვევითი რიცხვი ამ დიაპაზონიდან და შემდეგ მოიძიოთ ეს მწკრივი მონაცემთა ბაზიდან:

$sth = $dbh->query("SELECT COUNT(*) AS count FROM quotes");
თუ ($row = $sth->fetchRow()) (
$count = $row;
) სხვა (
die ($row->getMessage());
}
$შემთხვევითი = mt_rand(0, $count - 1);
$sth = $dbh->query ("SELECT quote FROM quotes LIMIT $random,1");
ხოლო ($row = $sth->fetchRow()) (
დაბეჭდეთ $ row .

"\n";
}

კოდის ეს ნაწყვეტი განსაზღვრავს ცხრილის მწკრივების მთლიან რაოდენობას, წარმოქმნის შემთხვევით რიცხვს ამ დიაპაზონიდან და შემდეგ იყენებს LIMIT $random,1 ცხრილიდან ერთი მწკრივის ასარჩევად, დაწყებული პოზიციიდან $შემთხვევით. MySQL 3.23 ან უფრო მაღალ ვერსიაში შესაძლებელია ალტერნატიული ვარიანტი:

$sth = $dbh->query("SELECT quote FROM quotes ORDER BY RAND() LIMIT 1");
ხოლო ($row = $sth->fetchRow()) (
დაბეჭდეთ $ row . "\n";
}

ამ შემთხვევაში, MySQL ჯერ რანდომიზირებს რიგებს და შემდეგ აბრუნებს პირველ რიგს.

ახდენს შემთხვევითი რიცხვების გენერატორის ინიცირებას. Სინტაქსი:

Void srand (int seed)

ახდენს შემთხვევითი რიცხვების გენერატორის ინიცირებას სათესლე მნიშვნელობით.

Srand((ორმაგი) მიკროდრო()*1000000);
$შემთხვევითი = rand();
ექო $ შემთხვევითი;

GETRANDMAX

აბრუნებს ყველაზე დიდ შესაძლო შემთხვევით რიცხვს. Სინტაქსი:

Int getrandmax()

ეს ფუნქცია აბრუნებს მაქსიმალურ მნიშვნელობას, რომლის მიღებაც შესაძლებელია rand() შემთხვევითი რიცხვების გენერირების ფუნქციის გამოყენებით.

ჩვეულებრივ ეს არის 32767

წარმოქმნის შემთხვევით რიცხვს. Სინტაქსი:

Int rand ()

როდესაც გამოიძახება არჩევითი 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-დან გამომდინარე, seed არჩევითია და შემთხვევითი მნიშვნელობების ნაგულისხმევი პარამეტრები გამოტოვებულია.

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(); echo rand (1,100); // მიეცით შემთხვევითი რიცხვი 1-დან 100-მდე

ფუნქცია srand. განსაზღვრავს რანდის ფუნქციით წარმოქმნილ შემთხვევით რიცხვთა თანმიმდევრობას. მას აქვს მთელი პარამეტრი - ამ პარამეტრის სხვადასხვა მნიშვნელობებისთვის, რენდი გამოიმუშავებს რიცხვების სხვადასხვა თანმიმდევრობას. srand ფუნქციის გამოძახება მხოლოდ ერთხელ არის საჭირო რანდის ფუნქციის ყველა გამოძახებამდე. გამოყენების მაგალითი:

სრანდი(1288); // შემთხვევითი რიცხვების გენერატორის ინიციალიზაცია ($i=0; $i