สวัสดีทุกคน! ในบทความนี้เราจะดูที่ มีอะไรใหม่สำหรับการสร้างตัวเลขสุ่มใน PHP 7.1.
การอัปเดตนี้เกิดขึ้นโดยมองไม่เห็นสำหรับนักพัฒนา แต่ได้ปรับปรุงภาษาการเขียนโปรแกรมแล้ว PHPในด้านการสร้างตัวเลขสุ่ม
เท่าที่ทราบมาใน. PHPเราสามารถใช้ฟังก์ชันได้ แรนด์ (ต่ำสุด, สูงสุด)เพื่อสร้างตัวเลขสุ่ม:
เอคโค่ แรนด์(7, 17);
หากคุณรีเฟรชหน้าตอนนี้คุณจะได้รับหมายเลขสุ่มใหม่ทุกครั้ง
แต่ไม่ใช่ทุกอย่างจะง่ายอย่างที่คิด ประเด็นก็คือขึ้นอยู่กับสิ่งที่คุณสร้างตัวเลขสุ่มสำหรับฟังก์ชัน แรนด์()ใช้ระบบการสร้างที่แตกต่างกัน เหล่านั้น. ขึ้นอยู่กับระบบที่ใช้งาน บางระบบอาจใช้วิธีการสร้างแบบอ่อนแอ ดังนั้นคุณจะได้รับตัวเลขที่ไม่ได้สุ่มทั้งหมด
ใน พีเอชพี 7.1ปัญหานี้ได้รับการแก้ไขแล้วและมีการเพิ่มคุณสมบัติแล้ว mt_rand():
เอคโค mt_rand(7, 17);
ฟีเจอร์นี้ทำงานได้ดีขึ้นมาก รวมถึงความปลอดภัยด้วย สิ่งสำคัญที่ต้องรู้ก็คือถ้าคุณใช้ฟังก์ชันนี้ แรนด์()วี พีเอชพี 7.1จากนั้นจะถูกเขียนทับโดยอัตโนมัติ mt_rand()- เหล่านั้น. แรนด์()ตอนนี้เป็นเพียงนามแฝงสำหรับ mt_rand().
มีการปรับปรุงฟังก์ชันอื่นๆ มากมายสำหรับการสร้างผลลัพธ์แบบสุ่ม พีเอชพี 7.1- ตัวอย่างเช่น มาดูกันว่าเราจะรับค่าสุ่มจากอาร์เรย์ได้อย่างไร:
$names = ["อีวาน", "อเล็กซานเดอร์", "วาซิลี่"];
สะท้อนชื่อ $;
เหล่านั้น. ฟังก์ชันใดๆ เช่นนี้ได้รับการปรับปรุงเพื่อให้สร้างตัวเลขสุ่มได้ดีขึ้น พีเอชพี 7.1- ใช่ การอัปเดตนี้ไม่มีใครสังเกตเห็น แต่ไม่ว่าคุณจะเขียนด้วยภาษาใดก็ตาม สิ่งสำคัญมากคือต้องเข้าใจว่าเกิดอะไรขึ้นภายในฟังก์ชันและลักษณะการทำงานของฟังก์ชัน
งานคุณต้องสร้างตัวเลขสุ่มภายในช่วงตัวเลข
สารละลาย
ฟังก์ชัน mt_rand() ได้รับการออกแบบมาเพื่อสิ่งนี้:
// รวมตัวเลขสุ่มระหว่าง $upper และ $lower
$random_number = mt_rand($ล่าง, $บน);
การอภิปราย
การสร้างตัวเลขสุ่มมีประโยชน์เมื่อคุณต้องการแสดงภาพสุ่มบนหน้าจอ สุ่มกำหนดจุดเริ่มต้นในเกม เลือกรายการสุ่มจากฐานข้อมูล หรือสร้างตัวระบุเซสชันที่ไม่ซ้ำกัน ในการสร้างตัวเลขสุ่มในช่วงเวลาระหว่างจุดสองจุด คุณจะต้องส่งอาร์กิวเมนต์สองตัวไปที่ฟังก์ชัน mt_rand():
$random_number = mt_rand(1, 100);
การเรียก mt_rand() โดยไม่มีอาร์กิวเมนต์จะส่งคืนตัวเลขระหว่างศูนย์ถึงจำนวนสุ่มสูงสุดที่ส่งคืนโดย mt_getrandmax() เป็นเรื่องยากสำหรับคอมพิวเตอร์ที่จะสร้างตัวเลขสุ่มอย่างแท้จริง เขาเก่งกว่ามากในการทำตามคำแนะนำอย่างมีระเบียบและไม่ดีนักถ้าเขาจำเป็นต้องทำอะไรตามใจชอบ หากคุณต้องการบังคับให้คอมพิวเตอร์สร้างตัวเลขสุ่ม คุณจะต้องให้ชุดคำสั่งที่สามารถทำซ้ำได้จำนวนหนึ่งแก่คอมพิวเตอร์ และความจริงของการทำซ้ำได้ทำให้การสุ่มเป็นไปได้น้อยลง
PHP มีโปรแกรมสร้างตัวเลขสุ่มที่แตกต่างกันสองแบบ: ฟังก์ชันคลาสสิกที่เรียกว่า rand() และฟังก์ชันขั้นสูง mt_rand()
MT (Mersenne Twister) คือเครื่องกำเนิดตัวเลขสุ่มหลอกที่ตั้งชื่อตามพระภิกษุชาวฝรั่งเศสและนักคณิตศาสตร์ Marin Mersenne ผู้ศึกษาจำนวนเฉพาะ อัลกอริธึมของเครื่องกำเนิดนี้ขึ้นอยู่กับจำนวนเฉพาะเหล่านี้ ฟังก์ชัน mt_rand() เร็วกว่าฟังก์ชัน rand() และสร้างตัวเลขสุ่มมากกว่า ดังนั้นเราจึงชอบแบบแรกมากกว่า
หากคุณมี PHP เวอร์ชันเก่ากว่า 4.2 ก่อนที่จะเรียกใช้ฟังก์ชัน mt_rand() (หรือ rand()) เป็นครั้งแรก คุณจะต้องเริ่มต้นตัวสร้างด้วยค่าเริ่มต้นโดยการเรียก mt_srand() (หรือ srand( )) การทำงาน. ข้อมูลเริ่มต้นคือตัวเลขที่ฟังก์ชันสุ่มใช้เป็นพื้นฐานในการสร้างตัวเลขสุ่มที่ส่งคืน มันหมายถึงวิธีการแก้ไขภาวะที่กลืนไม่เข้าคายไม่ออกที่กล่าวถึงข้างต้น - การทำซ้ำและการสุ่ม
เนื่องจากค่าเริ่มต้นที่เปลี่ยนแปลงอย่างรวดเร็วและมีโอกาสทำซ้ำได้ต่ำ (คุณสมบัติเหล่านี้ควรมีลักษณะเป็นค่าเริ่มต้นที่ดี) คุณสามารถรับค่าที่ส่งกลับโดยไมโครไทม์ของฟังก์ชันเวลาที่มีความแม่นยำสูง () เริ่มต้นเครื่องกำเนิดไฟฟ้าเพียงครั้งเดียวก็เพียงพอแล้ว PHP 4.2 และใหม่กว่าจัดการการเริ่มต้นโดยอัตโนมัติ แต่หากค่าเริ่มต้นถูกตั้งค่าด้วยตนเองก่อนการเรียก mt_rand() ครั้งแรก PHP จะไม่แทนที่ด้วยค่าเริ่มต้นของตัวเอง
หากคุณต้องการเลือกบันทึกแบบสุ่มจากฐานข้อมูล วิธีที่ง่ายที่สุดคือการกำหนดจำนวนฟิลด์ทั้งหมดในตารางก่อน เลือกตัวเลขสุ่มจากช่วงนั้น จากนั้นสอบถามแถวนั้นจากฐานข้อมูล:
$sth = $dbh->query("SELECT COUNT(*) AS count from quotes");
ถ้า ($row = $sth->fetchRow()) (
$count = $แถว;
) อื่น (
ตาย ($row->getMessage());
}
$สุ่ม = mt_rand(0, $count - 1);
$sth = $dbh->query("เลือกเครื่องหมายคำพูดจากเครื่องหมายคำพูด LIMIT $random,1");
ในขณะที่ ($row = $sth->fetchRow()) (
พิมพ์ $row .
"\n";
}
ข้อมูลโค้ดนี้จะกำหนดจำนวนแถวทั้งหมดในตาราง สร้างตัวเลขสุ่มจากช่วงนั้น จากนั้นใช้ LIMIT $random,1 เพื่อเลือกหนึ่งแถวจากตารางโดยเริ่มต้นที่ตำแหน่ง $random ใน MySQL เวอร์ชัน 3.23 หรือสูงกว่า มีตัวเลือกอื่นที่เป็นไปได้:
$sth = $dbh->query("เลือกคำพูดจากคำพูด ORDER BY RAND() จำกัด 1");
ในขณะที่ ($row = $sth->fetchRow()) (
พิมพ์ $row . "\n";
}
ในกรณีนี้ MySQL จะสุ่มแถวก่อนแล้วจึงส่งคืนแถวแรก
เริ่มต้นตัวสร้างตัวเลขสุ่ม ไวยากรณ์:
โมฆะ srand (เมล็ด int)
เริ่มต้นตัวสร้างตัวเลขสุ่มด้วยค่าเมล็ด
แสนด์((สองเท่า) ไมโครไทม์()*1000000);
$สุ่ม = แรนด์();
สะท้อน $ สุ่ม;
GETRANDMAX
ส่งกลับตัวเลขสุ่มที่ใหญ่ที่สุดที่เป็นไปได้ ไวยากรณ์:
Int getrandmax()
ฟังก์ชันนี้ส่งคืนค่าสูงสุดที่สามารถรับได้โดยใช้ฟังก์ชันการสร้างตัวเลขสุ่ม rand()
โดยปกติจะเป็น 32767
สร้างตัวเลขสุ่ม ไวยากรณ์:
Int แรนด์()
เมื่อเรียกด้วยพารามิเตอร์ขั้นต่ำและสูงสุดเผื่อเลือก ฟังก์ชันนี้จะสร้างตัวเลขสุ่มจนถึงและรวมพารามิเตอร์เหล่านั้นด้วย หากไม่มีพารามิเตอร์ min และ max ระบบจะส่งกลับตัวเลขตั้งแต่ 0 ถึง RAND_MAX
เพื่อให้ฟังก์ชันนี้ทำงานได้อย่างถูกต้อง ก่อนที่จะใช้งาน คุณจะต้องเริ่มต้นตัวสร้างตัวเลขสุ่มด้วยฟังก์ชัน srand()
lcg_value()
LCG ตัวสร้างตัวเลขสุ่มหลอก (PHP 4, PHP 5)
คำอธิบาย:
ลอย 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() เป็นการทดแทนที่ดี ใช้ตัวสร้างตัวเลขสุ่มที่เร็วกว่า rand() ถึง 4 เท่า และใช้ Mersenne Twister
เมื่อเรียกโดยไม่มีอาร์กิวเมนต์ min และ max ที่เป็นทางเลือก mt_rand() จะส่งกลับค่าสุ่มเทียมซึ่งอยู่ระหว่าง 0 ถึง RAND_MAX ตัวอย่างเช่น หากคุณต้องการรับค่าสุ่มระหว่าง 5 ถึง 15 ให้มองหา mt_rand (5, 15)
ตัวอย่างการใช้ mt_rand()
เสียงสะท้อน mt_rand() . "\n";
เสียงสะท้อน mt_rand() . "\n";
เสียงสะท้อน mt_rand (5, 15);
?>
ผลลัพธ์ของการรันตัวอย่างนี้จะเป็นดังนี้:
1604716014
1478613278
6
ความคิดเห็น
ความคิดเห็น: ในเวอร์ชันก่อน 3.0.7 พารามิเตอร์ตัวที่สองของฟังก์ชันจะระบุช่วงของตัวเลข ตัวอย่างเช่น หากต้องการรับตัวเลขสุ่มระหว่าง 5 ถึง 15 ในเวอร์ชันเหล่านี้ คุณต้องระบุฟังก์ชัน mt_rand(5, 11)
mt_srand()
ตั้งค่าเริ่มต้นของตัวสร้างตัวเลขสุ่มที่ดีที่สุด (PHP 3 >= 3.0.6, PHP 4, PHP 5)
คำอธิบาย:
โมฆะ mt_srand()
ตั้งค่าเริ่มต้นของเครื่องกำเนิดตัวเลขสุ่มโดยใช้เมล็ด ตั้งแต่ PHP 4.2.0 เป็นต้นไป seed เป็นทางเลือก และละเว้นการตั้งค่าเริ่มต้นสำหรับค่าสุ่ม
ตัวอย่างการใช้ mt_srand()
// เมล็ดด้วยไมโครวินาที
ฟังก์ชั่น make_seed()
{
list($usec, $sec) = explode(" ", microtime());
กลับ (ลอย) $sec + ((ลอย) $usec * 100000);
}
mt_srand(make_seed());
$randval = mt_rand();
?>
ความคิดเห็น: ตั้งแต่ PHP 4.2.0 เป็นต้นไป ไม่จำเป็นต้องเริ่มต้นตัวสร้างตัวเลขสุ่มด้วย srand() หรือ mt_srand() อีกต่อไป เนื่องจากตอนนี้จะดำเนินการโดยอัตโนมัติ
ตอนนี้เราใช้ฟังก์ชันการสร้างรหัสผ่านสำเร็จรูปและเขียนสคริปต์เพื่อกู้คืนหรือสร้างรหัสผ่านใหม่สำหรับผู้ใช้เว็บไซต์ของคุณ
สคริปต์การกู้คืนรหัสผ่าน
ปกติสคริปต์จะเขียนอย่างไร?
เช่นเคย มีการร่างโครงร่างทีละขั้นตอน สิ่งที่เราต้องทำทีละขั้นตอน ทุกอย่างเกิดขึ้นในไฟล์เดียว Reminder.php
1. เราจะรันสคริปต์เฉพาะเมื่อมีตัวแปรบางตัว เช่น $action;
2. เพื่อเริ่มกระบวนการสร้างรหัสผ่าน ผู้ใช้ระบุที่อยู่อีเมล $_POST[`ema'l`]; เพื่อให้โค้ดง่ายขึ้น ให้กำหนดค่านี้ให้กับตัวแปร $email
3. เราจะตรวจสอบอักขระทั้งหมดโดยใช้นิพจน์ทั่วไปเพื่อให้แน่ใจว่าผู้ใช้ป้อนที่อยู่อีเมลที่ถูกต้อง ถ้าไม่เช่นนั้น เราจะแสดงข้อผิดพลาดและหยุดสคริปต์ หากทุกอย่างถูกต้องเราจะเดินหน้าต่อไป
4. ในกรณีของเราเราจะค้นหาผู้ใช้ที่มีที่อยู่อีเมลนี้ในฐานข้อมูล ถ้าไม่เช่นนั้น เราจะแจ้งข้อผิดพลาดว่าไม่มีที่อยู่ดังกล่าวในฐานข้อมูลและหยุดสคริปต์
5. มีผู้ใช้ที่มีที่อยู่นี้อยู่ในฐานข้อมูล ดำเนินการต่อและเปิดใช้งานฟังก์ชั่นการสร้างรหัสผ่านใหม่ นอกจากนี้ เมื่อใช้ที่อยู่อีเมล เรายังได้รับรหัสเฉพาะของผู้ใช้จากฐานข้อมูลและเขียนลงในตัวแปร $id