Perhatikan bahwa pendekatan ini lebih bias dan kurang efisien daripada nextInt
pendekatan, https://stackoverflow.com/a/738651/360211
Satu pola standar untuk mencapai ini adalah:
Min + (int)(Math.random() * ((Max - Min) + 1))
The Java Math fungsi library Math.random () menghasilkan nilai ganda dalam kisaran[0,1)
. Perhatikan kisaran ini tidak termasuk 1.
Untuk mendapatkan rentang nilai tertentu terlebih dahulu, Anda perlu mengalikan dengan besarnya rentang nilai yang ingin Anda liput.
Math.random() * ( Max - Min )
Ini mengembalikan nilai dalam rentang [0,Max-Min)
, di mana 'Max-Min' tidak termasuk.
Misalnya, jika Anda ingin [5,10)
, Anda harus mencakup lima nilai integer sehingga Anda gunakan
Math.random() * 5
Ini akan mengembalikan nilai dalam rentang [0,5)
, di mana 5 tidak termasuk.
Sekarang Anda perlu menggeser rentang ini ke kisaran yang Anda targetkan. Anda melakukan ini dengan menambahkan nilai Min.
Min + (Math.random() * (Max - Min))
Anda sekarang akan mendapatkan nilai dalam rentang tersebut [Min,Max)
. Mengikuti contoh kita, itu berarti [5,10)
:
5 + (Math.random() * (10 - 5))
Tapi, ini masih belum termasuk Max
dan Anda mendapatkan nilai ganda. Untuk Max
memasukkan nilai, Anda perlu menambahkan 1 ke rentang parameter Anda (Max - Min)
dan kemudian memotong bagian desimal dengan melakukan casting ke int. Ini dicapai melalui:
Min + (int)(Math.random() * ((Max - Min) + 1))
Dan begitulah. Nilai integer acak dalam rentang [Min,Max]
, atau per contoh [5,10]
:
5 + (int)(Math.random() * ((10 - 5) + 1))