การสุ่มตัวเลขในภาษา PHP

3 December 2020

ในบทนี้ คุณจะได้เรียนรู้เกี่ยวกับการสุ่มตัวเลขในภาษา PHP โดยการใช้ฟังก์ชันมาตรฐานของภาษา rand() และ random_int() พร้อมกับการประยุกต์ใช้การสุ่มตัวเลขในการเขียนโปรแกรม นี่เป็นเนื้อหาในบทนี้

  • การสุ่มตัวเลขจำนวนเต็ม
  • การสุ่มตัวเลขทศนิยม
  • Random seed
  • การสุ่มตัวเลขด้วยฟังก์ชัน random_int()
  • ตัวอย่างโปรแกรมสุ่มค่าในอาเรย์

การสุ่มตัวเลขจำนวนเต็ม

ในภาษา PHP นั้นมีหลายฟังก์ชันที่เราสามารถใช้สำหรับสุ่มตัวเลข ในบทนี้เราจะแนะนำการใช้งานสองฟังก์ชันพื้นฐานที่สำคัญคือฟังก์ชัน rand() และ random_int()

เรามาเริ่มกับฟังก์ชัน rand() นี่เป็นรูปแบบการใช้งานฟังก์ชันสำหรับสุ่มตัวเลขในภาษา PHP

rand();
rand(int $min, int $max);

ในรูปแบบการใช้งานจะเห็นว่าเราสามารถเรียกใช้งานฟังก์ชัน rand() ได้สองรูปแบบคือแบบมีพารามิเตอร์และแบบไม่มีพารามิเตอร์

ในการเรียกใช้ฟังก์ชันแบบไม่มีพาราเตอร์ ค่าที่ได้จากการสุ่มจะมีค่าระหว่าง 0 และ getrandmax() โดยที่ฟังก์ชัน getrandmax() ส่งค่ากลับเป็นตัวเลขสูงสุดที่ฟังก์ชัน rand() สามารถสุ่มได้ และอาจมีค่าแตกต่างกันออกไปในแต่ละแพลตฟอร์ม โดยทั่วไปแล้วมักจะเป็น 2147483647

เมื่อเรียกใช้ฟังก์ชันโดยการส่งพารามิเตอร์ $min และ $max ค่าที่ได้จากการสุ่มจะมีค่าอยู่ในระหว่างช่วงของพารามิเตอร์ทั้งสอง ยกตัวอย่างเช่น เมื่อเราต้องการสุ่มตัวเลขระหว่าง 1 - 15 เราสามารถเรียกใช้ฟังก์ชันได้เป็น rand(1, 15)

นี่เป็นตัวอย่างการสุ่มตัวเลขในภาษา PHP โดยการใช้ฟังก์ชัน rand() ซึ่งเป็นฟังก์ชันสำหรับสุ่มตัวเลขจำนวนเต็มและจากช่วงที่กำหนด 1 - 10

random_number.php
<?php
echo rand() . "\n";
echo rand() . "\n";

echo rand(1, 10) . "\n";
echo rand(1, 10) . "\n";

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

1613029860
1050424609
3
7

ในตัวอย่าง เป็นการใช้งานฟังก์ชัน rand() สำหรับสุ่มตัวเลขในภาษา PHP ในสองคำสั่งแรกเป็นการเรียกใช้ฟังก์ชันโดยไม่มีพารามิเตอร์ ดังนั้นตัวเลขที่ได้จากการสุ่มจะมีค่าระหว่าง 0 - getrandmax() ในสองคำสั่งต่อมาเป็นการกำหนดช่วงของตัวเลขที่ต้องการสุ่มที่ส่งพารามิเตอร์เป็น rand(1, 10) ดังนั้นค่าที่ได้จากการสุ่มจะมีค่าระหว่าง 1 - 10

คุณสามารถดูค่าที่สูงสุดที่ฟังก์ชัน rand() สามารถส่งค่ากลับในกรณีที่เรียกโดยไม่มีพารามิเตอร์ได้โดยการเรียกดูค่าจากฟังก์ชัน getrandmax() ยกตัวอย่างเช่น

<?php
echo getrandmax(); // 2147483647

นั่นหมายความว่าค่าสูงสุดที่ฟังก์ชัน rand() สามารถส่งกลับในแพลตฟอร์มที่ตัวอย่างนี้ถูกรันอยู่คือ 2147483647 ซึ่งโดยปกติแล้วมักจะเป็นค่านี้

การสุ่มตัวเลขทศนิยม

ในภาษา PHP นั้นมีเพียงฟังก์ชันที่ใช้สำหรับสุ่มตัวเลขจำนวนเต็มจากช่วงที่กำหนดเท่านั้น ในบางกรณี เราอาจต้องการสุ่มตัวเลขในช่วงของตัวเลขทศนิยม เช่น สุ่มตัวเลขระหว่าง 0.0 - 1.0 หรือ 0.0 - 50.0 เป็นต้น เราสามารถทำเช่นนี้ได้โดยการประยุกต์ใช้ฟังก์ชัน rand() ที่ได้เรียนรู้ไปแล้ว

นี่เป็นตัวอย่างของโปรแกรมที่สุ่มตัวเลขระหว่าง 0.0 ถึง 1.0 แบบไม่รวม นั่นหมายความว่าค่าที่ได้จากการสุ่มจะอยู่ในช่วง 0.0 - 0.9999... แต่ไม่ถึง 1.0

random_float_number.php
<?php
function float_rand() {
    return rand() / (getrandmax() + 1);
}

for ($i = 0; $i < 5; $i++) {
    echo float_rand() . "\n";
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

0.99984939815477
0.28475092025474
0.96553335851058
0.45177939301357
0.1924843667075

ในตัวอย่าง ฟังก์ชัน float_rand() นั้นเป็นฟังก์ชันที่เราสร้างขึ้น มันใช้สำหรับสุ่มตัวเลขทศนิยมที่มีค่าระหว่าง 0.0 - 0.999... แต่ไม่ถึง 1.0 ซึ่งนี่เป็นวิธีมาตรฐานที่ฟังก์ชันสุ่มตัวเลขในภาษาอื่นๆ ใช้ เช่น ภาษา Java หรือภาษา JavaScript

rand() / (getrandmax() + 1);

สำหรับการทำงานของฟังก์ชันคือการนำค่าที่ได้จากการสุ่มหารด้วยค่าสูงสุดที่เป็นไปได้บวกด้วย 1 ไม่สำคัญว่าค่าที่ได้จากการสุ่มด้วยฟังก์ชัน rand() จะเป็นอะไร เมื่อมันถูกหารด้วยค่าสูงสุดบวกด้วย 1 ผลลัพธ์ที่ได้จะมีค่าอยู่ระหว่าง 0.0 - 0.9999... เสมอ

rand() / getrandmax();

แต่ถ้าหากคุณต้องการให้การสุ่มรวม 1.0 ด้วย สามารถทำได้โดยไม่ต้องบวกค่าที่นำมาหารด้วย 1 วิธีนี้จะทำให้ได้ค่าที่ได้จากการสุ่มมีค่าอยู่ระหว่าง 0.0 - 1.0

หลังจากที่เราเขียนฟังก์ชันในการสุ่มตัวเลขทศนิยมได้แล้ว ต่อไปเรามาใช้มันสำหรับสุ่มตัวเลขในช่วงอื่นๆ กัน ในตัวอย่างนี้เป็นการสุ่มตัวเลขระหว่าง 0.0 - 50.0 แบบไม่รวมค่าสุดท้าย นั่นหมายความว่าค่าที่เป็นไปได้จากการสุ่มจะอยู่ระหว่าง 0.0 - 49.9999...

random_float_ranged.php
<?php
function float_rand() {
    return rand() / (getrandmax() + 1);
}

for ($i = 0; $i < 5; $i++) {
    echo float_rand() * 50 . "\n";
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

37.555624707602
45.108538563363
17.619503824972
3.2156478147954
31.422375771217

เพื่อสุ่มตัวเลขทศนิยมที่มีค่าระหว่าง 0.0 - 50.0 แบบไม่รวม 50.0 เราเพียงแค่คูณผลลัพธ์ของการสุ่มด้วย 50 นั่นจะทำให้ตัวเลขที่ได้จากการสุ่มมีค่าอยู่ระหว่าง 0.0 - 49.9999...

นั่นหมายความว่าเราสามารถใช้ฟังก์ชันเพื่อสุ่มตัวเลขจากช่วงใดๆ ได้ โดยการคูณเข้ากับค่าสูงสุดเหมือนกับที่คุณเห็นในตัวอย่างก่อนหน้า ยกตัวอย่างเช่น เพื่อสุ่มตัวเลขจาก 0 - 100 เราสามารถเขียนคำสั่งได้เป็น

float_rand() * 100;

นี่เป็นการสุ่มตัวเลขทศนิยมที่มีค่าเริ่มต้นจาก 0.0 แต่ไม่เกิน 100.0

Random seed

ฟังก์ชันสุ่มตัวเลข rand() ในภาษา PHP นั้นใช้อัลกอริทึม Pseudorandom number generator (PRNG) สำหรับการสุ่มตัวเลข โดยอัลกอริทึม PRNG นั้นใช้สมการทางคณิตศาสตร์สำหรับสร้างลำดับของตัวเลขในการสุ่มโดยมี Random seed ในการกำหนดการทำงาน

Random seed คือตัวเลขที่ใช้กำหนดการทำงานของการตัวสุ่มตัวเลข โดยปกติแล้วเราจะต้องกำหนด Random seed ให้กับโปรแกรมเสมอ อย่างไรก็ตามในภาษา PHP ได้ทำขั้นตอนนี้ให้อัตโนมัติโดยใช้ค่าใช้ที่เปลี่ยนไปตลอดเวลา เช่น Timestamp ปัจจุบันของระบบเป็นนั่นทำให้เราไม่จำเป็นต้องกำหนดมันด้วยตัวเอง

อย่างไรก็ตาม เราสามารถกำหนดค่า Random seed ด้วยตัวเองได้หากต้องการ โดยการใช้ฟังก์ชัน srand() นี่จะทำให้เราสามารถควบคุมลำดับของตัวเลขจากการสุ่มได้ สิ่งหนึ่งที่ต้องเข้าใจเกี่ยวกับ Random seed สำหรับค่าของ Random seed ใดๆ นั้นจะให้ลำดับการสุ่มตัวเลขแบบเดิมเสมอ นี่เป็นตัวอย่าง

<?php
srand(12);

for ($i = 0; $i < 5; $i++) {
    echo rand() . ' ';
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

331062181 958253901 1589244611 1875584638 565464696

ฟังก์ชัน rand() นั้นทำงานภายใต้ค่าของ Random seed ที่เรากำหนดด้วยฟังก์ชัน srand() ในตอนตอนที่โปรแกรมเริ่มต้น และอย่างที่เราได้บอกไปสำหรับค่า Random seed ใดๆ นั้นจะให้ลำดับของการสุ่มจากการเรียกใช้ฟังก์ชัน rand() เหมือนเดิมเสมอ

นั่นหมายความว่าถ้าหากเรารันโปรแกรมด้านบนอีกครั้ง เราจะได้ลำดับของการสุ่มเหมือนเดิมกับการรันก่อนหน้า นั่นเป็นเพราะว่าค่า Random seed ที่มีค่าเป็น 12 ให้ลำดับการสุ่มในรูปแบบนี้เสมอ และนี่เป็นผลลัพธ์จากการรันโปรแกรมอีกครั้ง

331062181 958253901 1589244611 1875584638 565464696

จะเห็นว่าผลลัพธ์และลำดับของการสุ่มจะเป็นเหมือนเดิมเสมอสำหรับค่า Radom seed ที่เป็น 12 และนี่เป็นรูปแบบการทำงานพื้นฐานของการสุ่มตัวเลขแบบ PRNG ในภาษา PHP

ปัญหาของการสุ่มในรูปแบบนี้ก็คือถ้าหากมีใครสามารถจำลำดับของการสุ่มสำหรับค่า Random seed ใดๆ ได้ มันก็ง่ายที่เขาจะสามารถคาดเดาตัวเลขลำดับถัดไปจากการสุ่ม และนี่ถูกพิจารณาเป็นวิธีการสุ่มที่ไม่ปลอดภัย ดังนั้นเพื่อแก้ไขปัญหานี้เราจะต้องใช้วิธีใหม่ในการสุ่มตัวเลขที่เรียกว่า CSPRNG

การสุ่มตัวเลขด้วยฟังก์ชัน random_int()

ฟังก์ชัน rand() เป็นฟังก์ชันพื้นฐานในการสุ่มตัวเลขซึ่งเพียงพอสำหรับการใช้งานเพื่อวัตถุประสงค์ทั่วไป อย่างไรก็ตาม ผลลัพธ์ของการสุ่มนั้นสามารถคาดเดาได้ง่ายและถือว่าไม่ปลอดภัย เนื่องจากฟังก์ชันนี้ใช้อัลกอริทึม PRNG ที่ทำงานภายใต้ Random seed ในการสร้างตัวเลขแบบสุ่ม

ดังนั้นในภาษา PHP มีอีกฟังก์ชันที่สามารถใช้สุ่มตัวเลขได้นั่นคือฟังก์ชัน random_int() ฟังก์ชันนี้ใช้สำหรับตัวเลขที่ปลอดภัยด้วยอัลกอริทึม Cryptographically secure pseudorandom number (CSPRNG) เราสามารถใช้ฟังก์ชันนี้ได้ถ้าเราต้องการการสุ่มตัวเลขแบบจริงๆ ที่เหมือนกับการสุ่มในธรรมชาติ เช่น การสับไพ่สำหรับเกมโป๊กเกอร์ หรือการโยนเหรียญ เป็นต้น

นี่เป็นตัวอย่างการใช้งานฟังก์ชัน random_int() เพื่อสุ่มตัวเลขซึ่งหมายความว่าการสุ่มตัวเลขในแต่ละรอบผลลัพธ์จะเป็นอิสระต่อกัน

random_int.php
<?php
for ($i = 0; $i < 5; $i++) {
    echo random_int(1, 10) . " ";
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

9 6 4 10 3

ในตัวอย่างเป็นการใช้งานฟังก์ชัน random_int() สำหรับสุ่มตัวเลขจำนวนเต็มที่มีค่าระหว่าง 1 - 10 เป็นจำนวน 5 ตัวและแสดงผลออกทางหน้าจอ รูปแบบการใช้งานฟังก์ชันมีแบบเดียวเท่านั้นคือเราต้องกำหนดพารามิเตอร์สำหรับค่าเริ่มต้นและสิ้นสุดของการสุ่มเสมอ

ในการทำงานของฟังก์ชัน random_int() ใช้วิธีของการสุ่มที่ได้มาจากระบบปฏิบัติการ นั่นหมายความว่าระบบปฏิบัติการต้องสนับสนุนวิธีการสุ่มตัวเลขในรูปแบบ CSPRNG เพราะถ้าหากไม่มีจะทำให้เกิดข้อผิดพลาดขึ้นในโปรแกรม แต่ในปัจจุบันทุกระบบปฏิบัติการส่วนมากสนับสนุนการสุ่มตัวเลขด้วยวิธีนี้แล้ว

ตัวอย่างโปรแกรมสุ่มค่าในอาเรย์

สุดท้ายเป็นตัวอย่างการเขียนโปรแกรมสำหรับสุ่มค่าในอาเรย์ ซึ่งเป็นโปรแกรมสำหรับแจกสิ่งของให้กับคนที่โชคดีทั้งหมดโดยการสุ่ม มาดูกันว่าพวกเขาจะได้อะไรเป็นรางวัลกันบ้าง นี่เป็นโค้ดของโปรแกรม

random_items.php
<?php
$items = ["Mac", "iPhone", "iPad", "Watch", "Apple TV"];
$count = count($items);

$names = ["Metin", "Chris", "Joseph", "Morgan"];

echo "Reward for lucky people\n";
foreach ($names as $name) {
    $index = rand(0, $count - 1);
    echo $name . " got " . $items[$index] . "\n";
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

Reward for lucky people
Metin got iPad
Chris got Mac
Joseph got iPhone
Morgan got iPad

ในตัวอย่าง เป็นโปรแกรมสำหรับแจกของรางวัลให้กับผู้โชคดีที่มีรายชื่ออยู่ในอาเรย์ $names และแต่ละคนนั้นจะได้รับรางวัล โดยที่รางวัลจะเป็นของที่ได้มาจากการสุ่มค่าจากอาเรย์ $items

$items = ["Mac", "iPhone", "iPad", "Watch", "Apple TV"];
$count = count($items);

ในอาเรย์ $items นั้นเป็นของรางวัลทั้งหมดที่เป็นไปได้ที่ผู้โชคดีสามารถที่จะได้รับจากการสุ่ม ซึ่งจะเห็นว่ามีของ 5 อย่างในอาเรย์ และเรานับจำนวนของทั้งหมดเก็บไว้ในตัวแปร $count เพื่อใช้ในการสุ่ม จากนั้นวนแต่ละรายชื่อในอาเรย์ด้วยคำสั่ง foreach เพื่อสุ่มสิ่งของให้กับแต่ละคน

$index = rand(0, $count - 1);

เพื่อสุ่มค่าจากอาเรย์ $items เราได้ทำการสุ่มเอาค่า Index ของอาเรย์ด้วยฟังก์ชัน rand() ค่าเริ่มต้นของการสุ่มนั้นเป็น 0 ซึ่งเป็น Index ตำแหน่งแรกของอาเรย์ และค่าสูงสุดของการสุ่มเป็น $count - 1 ซึ่งเป็น Index ตำแหน่งสุดท้ายของอาเรย์

echo $name . " got " . $items[$index] . "\n"

จากนั้นเข้าถึงค่าในอาเรย์ด้วย $index ที่ได้จากการสุ่ม ซึ่งเป็นสิ่งของที่ผู้โชคดีแต่ละคนได้รับ ในตอนท้ายทุกคนจะได้รับของที่ได้จากการสุ่มคนละหนึ่งอย่างที่แสดงให้เห็นทางหน้าจอ

ในบทนี้ คุณได้เรียนรู้เกี่ยวกับการสุ่มตัวเลขในภาษา PHP เราได้พูดถึงการใช้งานฟังก์ชัน rand() ซึ่งเป็นฟังก์ชันพื้นฐานสำหรับการสุ่มตัวเลข การใช้งานฟังก์ชัน random_int() เพื่อสุ่มตัวเลขในรูปแบบ CSPRNG พร้อมตัวอย่างการประยุกต์ใช้การสุ่มตัวเลขในการเขียนโปรแกรม

บทความนี้เป็นประโยชน์หรือไม่? Yes · No