โปรดทราบว่าวิธีการนี้มีอคติมากกว่าและมีประสิทธิภาพน้อยกว่าnextInt
วิธีหนึ่งhttps://stackoverflow.com/a/738651/360211
หนึ่งรูปแบบมาตรฐานสำหรับการทำสิ่งนี้คือ:
Min + (int)(Math.random() * ((Max - Min) + 1))
Javaคณิตศาสตร์ฟังก์ชั่นห้องสมุด Math.random () สร้างค่า double [0,1)
ในช่วง ขอให้สังเกตช่วงนี้ไม่รวมถึง 1
ในการรับช่วงของค่าเฉพาะก่อนคุณต้องคูณด้วยขนาดของช่วงของค่าที่คุณต้องการครอบคลุม
Math.random() * ( Max - Min )
ส่งคืนค่าในช่วง[0,Max-Min)
โดยที่ 'Max-Min' ไม่รวมอยู่ด้วย
ตัวอย่างเช่นถ้าคุณต้องการ[5,10)
คุณจะต้องครอบคลุมค่าจำนวนเต็มห้าค่าเพื่อให้คุณใช้
Math.random() * 5
นี่จะส่งคืนค่าในช่วง[0,5)
โดยที่ 5 จะไม่รวม
ตอนนี้คุณต้องเปลี่ยนช่วงนี้เป็นช่วงที่คุณกำหนดเป้าหมาย คุณทำได้โดยการเพิ่มค่าต่ำสุด
Min + (Math.random() * (Max - Min))
[Min,Max)
ตอนนี้คุณจะได้รับค่าในช่วง ทำตามตัวอย่างของเรานั่นหมายความว่า[5,10)
:
5 + (Math.random() * (10 - 5))
แต่นี่ยังไม่รวมMax
และคุณจะได้รับค่าสองเท่า ในการรับMax
ค่าที่รวมคุณต้องเพิ่ม 1 ในพารามิเตอร์ช่วงของคุณ(Max - Min)
แล้วตัดส่วนทศนิยมด้วยการชี้ไปที่ int สามารถทำได้ผ่าน:
Min + (int)(Math.random() * ((Max - Min) + 1))
และคุณมีมัน ค่าจำนวนเต็มแบบสุ่มในช่วง[Min,Max]
หรือตามตัวอย่าง[5,10]
:
5 + (int)(Math.random() * ((10 - 5) + 1))