สุ่มหมายเลขในช่วง [ต่ำสุด - สูงสุด] โดยใช้ PHP


84

มีวิธีสร้างตัวเลขสุ่มตามค่าต่ำสุดและสูงสุดหรือไม่?

ตัวอย่างเช่นหากขั้นต่ำคือ 1 และสูงสุด 20 ควรสร้างตัวเลขใด ๆ ระหว่าง 1 ถึง 20 รวมทั้ง 1 และ 20?


1
php รุ่นใหม่ที่มีการรักษาความปลอดภัยแบบเข้ารหัสเครื่องกำเนิดไฟฟ้าจำนวนสุ่ม
Salvador Dali

1
สำหรับ PHP 7+ ใช้random_int(), หรือrandom_bytes() openssl_random_pseudo_bytes() ดังที่ @Salvador Dali กล่าวว่าrand()อย่าสร้างผลลัพธ์ที่ปลอดภัยด้วยการเข้ารหัส ดูเอกสารphp.net/manual/en/function.rand.php
FrozenFire

คำตอบ:


148
<?php
  $min=1;
  $max=20;
  echo rand($min,$max);
?>

ฉันคิดว่าค่าต่ำสุดและสูงสุดสำหรับแรนด์คือจำนวนหลักที่จะใช้แทนตัวเลข :) thnx
Val

ที่เกี่ยวข้อง: ถ้าPHP_INT_MAX < ($max-$min)คุณต้องเพิ่มช่วงเวลาเข้าด้วยกันตามที่อธิบายไว้ในคำตอบนี้
อธิการ

Rand () ก่อน PHP7.1 นั้นแย่มาก ใช้อัลกอริทึม LCG ซึ่งให้ผลลัพธ์ที่สามารถคาดเดาได้ มันยังช้าอีกด้วย เนื่องจาก PHP7.1 rand () ถูกสร้างเป็นนามแฝงของ mt_rand () จึงไม่เลวอีกต่อไป PHP7 ยังเปิดตัว random_int () ที่ปลอดภัยด้วยการเข้ารหัสอย่างไรก็ตามควรหลีกเลี่ยงเว้นแต่จำเป็นเนื่องจากมันช้ากว่า mt_rand () มาก
xZero

34

ในPHP7ใหม่มีการสนับสนุนสำหรับจำนวนเต็มสุ่มหลอกที่ปลอดภัยในการเข้ารหัส

int random_int ( int $min , int $max )

random_int - สร้างจำนวนเต็มสุ่มหลอกที่ปลอดภัยด้วยการเข้ารหัส

ซึ่งโดยพื้นฐานแล้วทำให้คำตอบก่อนหน้านี้ล้าสมัย


2
เยี่ยมมาก! แต่จนกว่าเว็บโฮสต์จะรองรับ PHP7 มากขึ้นทั่วโลกสิ่งนี้ไม่มีประโยชน์สำหรับทุกคนที่สร้างผลิตภัณฑ์เพื่อแจกจ่าย ดังนั้นคำตอบก่อนหน้านี้ที่ยังทำงานบน PHP7 ยังคงเป็นแนวทางปฏิบัติที่ดีที่สุด
Matt Cromwell

1
@MattCromwell. ฉันไม่เห็นด้วยกับคุณ. จนกระทั่งบริการโฮสติ้งสนับสนุน PHP7 เราควรใช้ polyfill สำหรับrandom_intและrandom_bytesฟังก์ชั่น - github.com/paragonie/random_compat
Vladimir Posvistelik

ฉันอยากรู้ว่ามีเหตุผลrandom_int อะไรบ้างที่จะไม่ใช้? หากให้ตัวเลขสุ่ม "ดีกว่า" ทำไมไม่ใช้ด้วยเหตุผลที่ไม่ใช่การเข้ารหัสลับ
Brian Leishman

1
@BrianLeishman ฉันอยากจะใช้มันสำหรับทุกสิ่ง ข้อเสียเพียงอย่างเดียวที่ฉันสามารถเดาได้: มันอาจขึ้นอยู่กับแหล่งที่มาของการสุ่มและอาจล้มเหลวหากคุณไม่อยู่ในการสุ่ม อาจมีราคาแพงกว่า (ต้องตรวจสอบ) แต่ฉันสงสัยว่าฟังก์ชันนี้สร้างความแตกต่างอย่างมาก
Salvador Dali

ฉันรู้ว่ามันช้าลง แต่ก็ไม่มีนัยสำคัญพอที่จะไม่ย้อนกลับไปเปลี่ยนrandom_ints ที่มีอยู่แล้วให้randเป็น s นอกจากนี้กรณีการใช้งานของฉันคืออัลกอริธึมการลองใหม่และฉันไม่ต้องการให้ฟังก์ชันที่ล้มเหลวหลายตัวจับกลุ่มหลังจากนอนหลับเนื่องจากการสุ่มแบบสุ่มที่คาดเดาได้
Brian Leishman

19

เร็วรุ่นที่เร็วขึ้นจะใช้ mt_rand:

$min=1;
$max=20;
echo mt_rand($min,$max);

ที่มา: http://www.php.net/manual/en/function.mt-rand.php http://www.php.net/manual/en/function.mt-rand.php

หมายเหตุ:เซิร์ฟเวอร์ของคุณจำเป็นต้องเปิดใช้งานโมดูล Math PHP เพื่อให้สามารถใช้งานได้ หากไม่เป็นเช่นนั้นให้บักโฮสต์ของคุณเพื่อเปิดใช้งานหรือคุณต้องใช้แรนด์ปกติ (และช้ากว่า)


6
คุณหมายถึงเร็วขึ้นใช่ไหม ความแตกต่างคือ (พิมพ์ == เร็ว VS ประสิทธิภาพการทำงานได้เร็วขึ้นอย่างชาญฉลาด ==)
Val

english.stackexchange.com/questions/31732/… - จริงได้ทั้งสองอย่าง
pee2pee


6

ฉันได้รวมคำตอบไว้ที่นี่และทำให้เป็นเวอร์ชันอิสระ

function generateRandom($min = 1, $max = 20) {
    if (function_exists('random_int')):
        return random_int($min, $max); // more secure
    elseif (function_exists('mt_rand')):
        return mt_rand($min, $max); // faster
    endif;
    return rand($min, $max); // old
}


0

ลองอันนี้. มันจะสร้าง id ตามที่คุณต้องการ

function id()
{
 // add limit
$id_length = 20;

// add any character / digit
$alfa = "abcdefghijklmnopqrstuvwxyz1234567890";
$token = "";
for($i = 1; $i < $id_length; $i ++) {

  // generate randomly within given character/digits
  @$token .= $alfa[rand(1, strlen($alfa))];

}    
return $token;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.