Php შემთხვევითი რიცხვი 1-დან 10-მდე. რა არის ახალი PHP7.1-ში: შემთხვევითი რიცხვების გენერირება. შემთხვევითი ნომრები JavaScript-ში

მე უკვე რამდენჯერმე მკითხეს, როგორ ვაკეთებ შემთხვევით ციტატებს ჩემს ვებსაიტზე "ჭკვიანი ციტატების" ბლოკში. შემდეგ, მე მოვახერხე იმის გარკვევა, რომ პრობლემა აქ არის ის, რომ ადამიანებს არ ესმით, როგორ გამოიყვანონ შემთხვევითი ელემენტი მასივიდან PHP-ში. ამოცანა მარტივია, მაგრამ მიუხედავად ამისა, რადგან კითხვები ჩნდება, მათ პასუხი უნდა გაეცეს.

კოდს მაშინვე მოგცემ. ვთქვათ, არის მასივი ციტატების ნაკრებით. თქვენ უნდა აირჩიოთ ერთი შემთხვევითი მათგანი და გამოიყვანოთ:

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

რაც შეეხება ბრჭყალებთან დავალებას, უმჯობესია შეინახოთ ისინი მონაცემთა ბაზაში. პრინციპში, თუ საიტი ძალიან მარტივია, მაშინ ეს შეიძლება გაკეთდეს ტექსტურ ფაილში. მაგრამ თუ მონაცემთა ბაზაში, მაშინ უმჯობესია გამოიყენოთ RAND() და LIMIT SQL მოთხოვნაში, რათა დაუყოვნებლივ მიიღოთ ერთი და შემთხვევითი ციტატა მონაცემთა ბაზიდან.

შემთხვევითი რიცხვის გენერირებისთვის შეგიძლიათ გამოიყენოთ 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((ორმაგი) მიკროდრო()*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); // შემთხვევითი რიცხვების გენერატორის ინიციალიზაცია for($i=0; $iquery("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 ჯერ რანდომიზირებს რიგებს და შემდეგ აბრუნებს პირველ რიგს.