PHP วิธีรับตัวเลขสุ่มที่แตกต่างจากค่าของอาร์เรย์

ตัวอย่าง: ฉันมีอาร์เรย์ที่มี 3 ค่า:

0 = 1
1 = 4
2 = 5

อยากได้เลขสุ่มแบบ.

$random = rand(1, 5);

แต่ฉันต้องได้ตัวเลขที่แตกต่างจากค่าอาร์เรย์ ฉันต้องการให้มันกลับมา 2 หรือ 3


person Rockman    schedule 09.04.2015    source แหล่งที่มา
comment
คุณมีช่วงจากตำแหน่งที่คุณต้องการได้ตัวเลขสุ่ม แต่ไม่มีตัวเลขจากอาร์เรย์ของคุณใช่ไหม? คุณได้ลองอะไรบางอย่างหรือยัง?   -  person Rizier123    schedule 10.04.2015
comment
ขอบคุณสำหรับคำตอบ! มันใช้งานได้ แต่ฉันได้รับข้อผิดพลาดร้ายแรงในบางครั้ง: ข้อผิดพลาดร้ายแรง: เกินเวลาดำเนินการสูงสุด 30 วินาที   -  person Rockman    schedule 10.04.2015
comment
@Rockman คุณอ่านความคิดเห็นแรกของฉันแล้วหรือยัง ^?   -  person Rizier123    schedule 10.04.2015
comment
คุณกำลังไม่รวมตัวเลขสุ่มที่เป็นไปได้ส่วนใหญ่ ดังนั้นบางครั้งอาจต้องลองหลายครั้งก่อนที่จะเลือกอันที่ได้รับอนุญาต   -  person Barmar    schedule 10.04.2015


คำตอบ (1)


สิ่งนี้น่าจะเหมาะกับคุณ:

(ในที่นี้ ฉันจะสร้างช่วงที่คุณจะได้รับหมายเลขสุ่มด้วย range() จากนั้น ฉันจะกำจัดตัวเลขเหล่านี้ซึ่งคุณไม่ต้องการด้วย array_diff() และในตอนท้ายคุณสามารถใช้ array_rand() เพื่อรับคีย์สุ่ม/ ตัวเลข)

<?php

    $blacklist = [1, 4, 5];
    $range = range(1, 5);
    $randomArray = array_diff($range, $blacklist);
    echo $randomArray[array_rand($randomArray, 1)];

?>

เอาท์พุท:

2 or 3

แก้ไข:

เพิ่งทำการวัดประสิทธิภาพและวิธีการที่มีการวนซ้ำช้ากว่าโค้ดด้านบนมาก!

ฉันสร้างอาร์เรย์ (บัญชีดำ) จาก 1...100'000 และอาร์เรย์ตัวเลขสุ่มจาก 1... 100'001

ดังนั้นสคริปต์นั้นควรสร้างตัวเลขสุ่มหนึ่งตัวเท่านั้น ด้วยวิธีการวนซ้ำ คุณได้รับข้อผิดพลาด:

ข้อผิดพลาดร้ายแรง: เกินเวลาดำเนินการสูงสุด 30 วินาที

และด้วยโค้ดที่โพสต์ด้านบนจะใช้เวลาโดยเฉลี่ย 1.5 วินาที

person Rizier123    schedule 09.04.2015
comment
นี่ดีกว่าการวนซ้ำมาก ไม่ควรทำให้เกิดข้อผิดพลาดเกินเวลา - person Barmar; 10.04.2015
comment
@Barmar ขอบคุณ นั่นเป็นเหตุผลที่ฉันโพสต์เมื่อฉันเห็นการหลอกลวงที่เป็นไปได้เนื่องจากไม่มีคำตอบดังกล่าว - person Rizier123; 10.04.2015
comment
@Barmar เพิ่งทำการวัดประสิทธิภาพและมันมีความแตกต่างอย่างมาก! (ดูคำตอบที่อัปเดต) - person Rizier123; 10.04.2015
comment
@ Rizier123 ขอบคุณอีกครั้ง! มันทำงานได้ดีและเป็นสิ่งที่ฉันกำลังมองหาจริงๆ ฉันไม่รู้จัก array_diff นี้ - person Rockman; 10.04.2015
comment
@Rockman ยินดีต้อนรับ! (BTW: คุณสามารถยอมรับคำตอบได้ว่าช่วยคุณได้มากที่สุดและแก้ไขปัญหาของคุณได้อย่างไร (meta.stackexchange.com/q/5234) !) - person Rizier123; 10.04.2015
comment
ยอมรับแล้ว เดาว่า... นี่เป็นคำถามแรกของฉันใน stackoverflow ฉันยังเรียนรู้วิธีใช้งานอยู่ อิอิ - person Rockman; 10.04.2015
comment
@Rockman ไม่มีปัญหา ขอให้สนุกกับวันของคุณ :D (เพื่อทราบ: คุณสามารถทัวร์ชมได้ที่นี่: stackoverflow.com/tour และดูวิธีการเล็กน้อย ไซต์นี้ใช้งานได้และทุกอย่างอยู่ที่ไหน) - person Rizier123; 10.04.2015