Bagaimana saya menghasilkan bilangan bulat acak dalam rentang tertentu di pulau Jawa?
Bagaimana saya menghasilkan acak int
nilai dalam rentang tertentu?
Saya telah mencoba mengikuti, tapi mereka tidak bekerja:
Upaya 1:
randomNum = minimum + (int)(Math.random() * maximum);
// Bug: `randomNum` can be bigger than `maximum`.
Percobaan 2:
Random rn = new Random();
int n = maximum - minimum + 1;
int i = rn.nextInt() % n;
randomNum = minimum + i;
// Bug: `randomNum` can be smaller than `minimum`.
3359
65
Di 1.7 Jawa atau yang lebih baru, cara standar untuk melakukan ini adalah sebagai berikut:
Lihat relevan JavaDoc. Pendekatan ini memiliki keuntungan tidak perlu secara eksplisit menginisialisasi jawa.util.Random misalnya, yang dapat menjadi sumber kebingungan dan kesalahan jika digunakan secara tidak tepat.
Namun, sebaliknya tidak ada cara untuk secara eksplisit mengatur benih sehingga dapat menjadi sulit untuk mereproduksi hasil dalam situasi di mana yang berguna seperti pengujian atau menyelamatkan negara permainan atau serupa. Dalam situasi tersebut, pra-Jawa 1.7 teknik yang ditunjukkan di bawah ini dapat digunakan.
Sebelum Java 1.7, cara standar untuk melakukan ini adalah sebagai berikut:
Lihat relevan JavaDoc. Dalam prakteknya, jawa.util.Random kelas ini sering lebih baik untuk jawa.lang.Matematika.random().
Secara khusus, ada tidak perlu untuk menemukan kembali random integer generasi roda ketika ada API sederhana dalam standar perpustakaan untuk menyelesaikan tugas.
Perhatikan bahwa pendekatan ini lebih bias dan kurang efisien daripada
nextInt
pendekatan, https://stackoverflow.com/a/738651/360211Salah satu pola standar untuk mencapai ini adalah:
The Jawa perpustakaan Matematika fungsi Matematika.random() menghasilkan nilai ganda dalam kisaran
[0,1)
. Pemberitahuan kisaran ini tidak termasuk 1.Dalam rangka untuk mendapatkan kisaran tertentu dari nilai pertama, anda perlu untuk berkembang biak oleh besarnya kisaran nilai-nilai yang anda inginkan tertutup.
Ini mengembalikan nilai dalam kisaran
[0,Max-Min)
, di mana 'Max-Min' tidak termasuk.Misalnya, jika anda ingin
[5,10)
, anda perlu untuk menutupi lima nilai integer agar anda gunakanIni akan mengembalikan nilai dalam kisaran
[0,5)
, di mana 5 tidak termasuk.Sekarang anda perlu untuk pergeseran ini berkisar hingga kisaran yang anda targetkan. Anda melakukan ini dengan menambahkan nilai Min.
Anda sekarang akan mendapatkan nilai di kisaran
[Min,Max)
. Berikut contoh kita, yang berarti[5,10)
:Tapi, ini masih doesn't seperti
Max
dan anda mendapatkan nilai ganda. Dalam rangka untuk mendapatkanMax
nilai disertakan, anda perlu menambahkan 1 ke kisaran parameter(Max - Min)
dan kemudian memotong desimal bagian dengan pengecoran ke int. Hal ini dicapai melalui:Dan di sana anda memilikinya. Acak nilai integer dalam range
[Min,Max]
, atau per contoh[5,10]
:Gunakan:
Integer
x
sekarang nomor acak yang memiliki hasil yang mungkin dari5-10
.Gunakan:
Dengan [tag:jawa-8] mereka memperkenalkan metode
int(int randomNumberOrigin, int randomNumberBound)
diRandom
kelas.Misalnya jika anda ingin menghasilkan lima bulat acak (atau salah satu) dalam jangkauan [0, 10], lakukan:
Parameter pertama menunjukkan hanya ukuran
IntStream
yang dihasilkan (yang merupakan kelebihan beban metode yang menghasilkan unlimitedIntStream
).Jika anda perlu melakukan beberapa panggilan terpisah, anda dapat membuat aplikasi yang tak terbatas primitif iterator dari stream:
Anda juga dapat melakukan itu untuk
double
danpanjang
nilai-nilai.Semoga membantu! :)
Anda dapat mengedit kedua contoh kode untuk:
Hanya modifikasi kecil dari anda solusi pertama akan cukup.
Lihat lebih lanjut di sini untuk pelaksanaan
Random
The
Matematika.Random
kelas di Jawa adalah 0-based. Jadi, jika anda menulis sesuatu seperti ini:x
akan antara0-9
inklusif.Jadi, diberikan berikut para
25
barang-barang, kode untuk menghasilkan nomor acak antara0
(dasar array) danarray.panjang
akan sama:Sejak
saya.panjang
akan kembali25
, yangnextInt( saya.panjang )
akan kembali sejumlah antara berbagai0-24
. Pilihan lain akan dengan Matematika.Random` yang bekerja dengan cara yang sama.Untuk pemahaman yang lebih baik, check out forum post Interval waktu yang Acak (archive.org).
ThreadLocalRandom setara dengan kelas java.util.Acak untuk multithreaded lingkungan. Menghasilkan angka acak yang dilakukan secara lokal di setiap thread. Jadi kita memiliki kinerja yang lebih baik dengan mengurangi konflik.
x,y - interval misalnya (1,10)
Maafkan aku untuk menjadi cerewet, tapi solusi yang disarankan oleh mayoritas, yaitu,
menit + rng.nextInt(max - min + 1))
, tampaknya berbahaya karena fakta bahwa:rng.nextInt(n)
bisa mencapaiInteger.MAX_VALUE
.(max - min)
dapat menyebabkan meluap ketikamin
adalah negatif.Sebuah solusi yang sangat mudah akan memberikan hasil yang benar untuk setiap
menit <= max
dalam [bilangan Bulat.MIN_VALUE
,Integer.MAX_VALUE
]. Pertimbangkan hal berikut naif pelaksanaan:Meskipun tidak efisien, perhatikan bahwa probabilitas keberhasilan dalam
sementara
loop akan selalu menjadi 50% atau lebih tinggi.Hal ini dapat dilakukan dengan hanya melakukan pernyataan:
jawa Randomizer.menghasilkan(0,10); //menit dari nol, max sepuluh
Di bawah ini adalah source-code
Randomizer.java
jawa public class Randomizer { public static int menghasilkan(int menit,int max) { kembali min + (int)(Math.random() * ((max - min) + 1)); } }
Itu hanya bersih dan sederhana.
Aku bertanya-tanya jika salah satu nomor acak menghasilkan metode-metode yang disediakan oleh Apache Commons Matematika perpustakaan akan sesuai dengan tagihan.
Misalnya:
RandomDataGenerator.nextInt
atauRandomDataGenerator.nextLong
Mari kita ambil contoh.
Misalkan saya ingin menghasilkan angka antara 5-10:
Mari kita memahami ini...
Menghasilkan nomor acak untuk perbedaan min dan max dengan menggunakan nextint(n) metode dan kemudian tambahkan min nomor hasilnya:
Joshua Bloch. Efektif Jawa. Edisi Ketiga.
Mulai dari Jawa 8
Untuk fork bergabung renang dan sungai paralel, menggunakan
SplittableRandom
yang biasanya lebih cepat, lebih baik statistik kemerdekaan dan keseragaman sifat-sifat dalam perbandingan denganRandom
.Untuk menghasilkan acak
int
di kisaran[0, 1_000]:
Untuk menghasilkan acak
int[100]
array dari nilai-nilai dalam kisaran[0, 1_000]:
Untuk mengembalikan Aliran nilai acak:
Metode ini mungkin akan nyaman untuk digunakan:
Metode ini akan menghasilkan nomor acak antara disediakan min dan max nilai:
dan metode ini akan mengembalikan sebuah nomor acak dari disediakan min dan max nilai (sehingga angka yang dihasilkan juga bisa min atau max number):
Dalam kasus bergulir dadu itu akan menjadi nomor acak antara 1 sampai 6 (tidak 0 sampai 6), sehingga:
Atau lihatlah ke RandomUtils dari Apache Commons.
Berikut ini's kelas membantu untuk menghasilkan acak
int
dalam berbagai dengan kombinasi inklusif/eksklusif-batas: