Lưu ý rằng phương pháp này thiên vị hơn và kém hiệu quả hơn nextInt
phương pháp, https://stackoverflow.com/a/738651/360211
Một mô hình chuẩn để thực hiện điều này là:
Min + (int)(Math.random() * ((Max - Min) + 1))
Hàm thư viện Java Math Math.random () tạo ra một giá trị kép trong phạm vi[0,1)
. Lưu ý phạm vi này không bao gồm 1.
Để có được một phạm vi giá trị cụ thể trước tiên, bạn cần nhân với độ lớn của phạm vi giá trị bạn muốn bảo hiểm.
Math.random() * ( Max - Min )
Điều này trả về một giá trị trong phạm vi [0,Max-Min)
, trong đó 'Max-Min' không được bao gồm.
Ví dụ: nếu bạn muốn [5,10)
, bạn cần bao gồm năm giá trị số nguyên để bạn sử dụng
Math.random() * 5
Điều này sẽ trả về một giá trị trong phạm vi [0,5)
, trong đó 5 không được bao gồm.
Bây giờ bạn cần chuyển phạm vi này lên phạm vi mà bạn đang nhắm mục tiêu. Bạn làm điều này bằng cách thêm giá trị Min.
Min + (Math.random() * (Max - Min))
Bây giờ bạn sẽ nhận được một giá trị trong phạm vi [Min,Max)
. Theo ví dụ của chúng tôi, điều đó có nghĩa là [5,10)
:
5 + (Math.random() * (10 - 5))
Nhưng, điều này vẫn không bao gồm Max
và bạn đang nhận được một giá trị gấp đôi. Để có được Max
giá trị được bao gồm, bạn cần thêm 1 vào tham số phạm vi của mình (Max - Min)
và sau đó cắt phần thập phân bằng cách chuyển sang int. Điều này được thực hiện thông qua:
Min + (int)(Math.random() * ((Max - Min) + 1))
Và bạn có nó rồi đấy! Một giá trị số nguyên ngẫu nhiên trong phạm vi [Min,Max]
hoặc theo ví dụ [5,10]
:
5 + (int)(Math.random() * ((10 - 5) + 1))