本文实例为大家分享了 Java 随机数生成代码 , 供大家参考 , 具体内容如下
paket com.gonvan.common.utils; impor java.util.*; /** * 随机数工具 * * @Author yuerzm * * /Public Final Class Lotteryaliasmethod { /** * Generator nomor acak yang digunakan untuk mengambil sampel dari distribusi. */ Private Final Random Random; /*** Tabel alias. */ alias final final; /*** Tabel probabilitas. */ probabilitas final ganda [] privat; /** * Membangun alimethod baru untuk sampel dari distribusi diskrit dan * hasil tangan kembali berdasarkan distribusi probabilitas. * <p/> * diberikan sebagai input daftar probabilitas yang sesuai dengan hasil 0, 1, * ..., n - 1, konstruktor ini menciptakan tabel probabilitas dan alias * yang diperlukan untuk secara efisien sampel dari distribusi ini. * * @param probabilitas * Daftar probabilitas. */ lotteryalimethod public (daftar <Bouble> probabilitas) {this (probabilitas, acak baru ()); } /** * Membangun aliasmethod baru untuk sampel dari distribusi diskrit dan * hasil tangan kembali berdasarkan distribusi probabilitas. * <p/> * Diberikan sebagai input daftar probabilitas yang sesuai dengan hasil 0, 1, * ..., n - 1, bersama dengan generator angka acak yang harus digunakan sebagai * generator yang mendasarinya, konstruktor ini menciptakan probabilitas dan * tabel alias yang diperlukan untuk secara efisien sampel dari distribusi ini. * * @param probabilitas * Daftar probabilitas. * @param acak * Generator nomor acak * / lotteryalimethod publik (daftar <mouble> probabilitas, acak acak) { / * Mulailah dengan melakukan pemeriksaan struktural dasar pada input. */ if (probabilitas == null || acak == null) lempar nullpointerexception baru (); if (probabilities.size () == 0) Lempar IllegalArgumentException baru ("Vektor probabilitas harus tidak kosong."); /* Alokasikan ruang untuk tabel probabilitas dan alias. */ probabilitas = ganda baru [probabilitas.size ()]; alias = int baru [probability.size ()]; /* Simpan generator yang mendasarinya. */ this.random = acak; /* Hitung probabilitas rata -rata dan cache untuk digunakan nanti. * / rata -rata ganda akhir = 1.0 / probabilitas.size (); / * * Buat salinan daftar probabilitas, karena kami akan membuat * perubahan padanya. */ probabilitas = ArrayList baru <Bouble> (probabilitas); /* Buat dua tumpukan untuk bertindak sebagai daftar kerja saat kami mengisi tabel. */ Deque <Integer> Small = ArrayDeque baru <Integer> (); Deque <Integer> besar = arraydeque baru <Integer> (); /* Mengisi tumpukan dengan probabilitas input. * / untuk (int i = 0; i <probability.size (); ++ i) { / * * Jika probabilitas di bawah probabilitas rata -rata, maka kami menambahkan * ke daftar kecil; Kalau tidak, kami menambahkannya ke daftar besar. */ if (probabilities.get (i)> = rata -rata) besar.add (i); selain itu Small.add (i); } / * * Sebagai catatan: Dalam spesifikasi matematika algoritma, kami * akan selalu menghabiskan daftar kecil sebelum daftar besar. Namun, * karena ketidakakuratan titik mengambang, ini belum tentu benar. * Akibatnya, loop dalam ini (yang mencoba memasangkan elemen kecil dan besar *) harus memeriksa bahwa kedua daftar itu tidak kosong. * / while (! Small.isempty () &&! Large.isempty ()) { /* Dapatkan indeks probabilitas kecil dan besar. */ int less = small.removelast (); int lebih = besar.removelast (); / * * Probabilitas ini belum ditingkatkan sedemikian rupa sehingga * 1/n diberi berat 1.0. Kami melakukan ini di sini sebagai gantinya. */ probabilitas [kurang] = probabilitas.get (kurang) * probabilitas.size (); alias [kurang] = lebih; / * * Kurangi probabilitas yang lebih besar dengan jumlah * yang sesuai. */ probabilities.set (selengkapnya, (probabilities.get (lebih) + probabilitas.get (kurang)) - rata -rata); / * * Jika probabilitas baru kurang dari rata -rata, tambahkan ke dalam daftar kecil; Jika tidak, tambahkan ke daftar besar. * / if (probabilities.get (lebih)> = 1.0 / probabilities.size ()) besar.add (selengkapnya); lain kecil. } / * * Pada titik ini, semuanya ada dalam satu daftar, yang berarti bahwa * probabilitas yang tersisa harus 1 /n. Berdasarkan ini, atur mereka * dengan tepat. Karena masalah numerik, kami tidak dapat memastikan * tumpukan mana yang akan menahan entri, jadi kami mengosongkan keduanya. */ while (! small.isempty ()) probabilitas [small.removelast ()] = 1.0; while (! great.isempty ()) probabilitas [large.removelast ()] = 1.0; } /*** Sampel nilai dari distribusi yang mendasarinya. * * @return Nilai acak yang diambil sampelnya dari distribusi yang mendasarinya. * / public int next () { /* Hasilkan die roll yang adil untuk menentukan kolom mana yang akan diperiksa. */ int kolom = random.nextInt (probability.length); /* Menghasilkan lemparan koin yang bias untuk menentukan opsi mana yang harus dipilih. */ boolean cointoss = acak.nextdouble () <probabilitas [kolom]; /* Berdasarkan hasilnya, kembalikan kolom atau aliasnya. */ return cointoss? kolom: alias [kolom]; }}以上就是本文的全部内容 , 希望对大家的学习有所帮助。