Dalam senario di mana menjana integer rawak yang besar secara sewenang-wenangnya dalam julat tertentu adalah perlu, pendekatan biasa mungkin melibatkan penggunaan nextDouble() dan pendaraban keluaran mengikut had yang dikehendaki. Walau bagaimanapun, kaedah ini menjadi bermasalah untuk nilai yang melebihi 2^53, yang membawa kepada pengedaran tidak seragam.
Untuk mengatasi had ini, Java menyediakan kelas BigInteger, yang menawarkan pembina yang menjana nombor rawak yang diedarkan secara seragam antara 0 dan (2^numBits - 1), inklusif.
Untuk menjana nilai rawak dalam julat 0 hingga n, di mana n bukan kuasa 2, gelung mudah boleh digunakan:
<code class="java">BigInteger randomNumber; do { randomNumber = new BigInteger(upperLimit.bitLength(), randomSource); } while (randomNumber.compareTo(upperLimit) >= 0);</code>
Pendekatan berulang ini memastikan pengedaran seragam dalam julat yang dikehendaki. Biasanya, hanya satu atau dua lelaran diperlukan.
Untuk senario di mana penjana nombor rawak mahal dari segi pengiraan, bilangan lelaran dalam gelung boleh dihadkan seperti berikut :
<code class="java">int nlen = upperLimit.bitLength(); BigInteger nm1 = upperLimit.subtract(BigInteger.ONE); BigInteger randomNumber, temp; do { temp = new BigInteger(nlen + 100, randomSource); randomNumber = temp.mod(upperLimit); } while (s.subtract(randomNumber).add(nm1).bitLength() >= nlen + 100);</code>
Versi yang diubah suai ini berkemungkinan besar tidak memerlukan berbilang lelaran (kebarangkalian kurang daripada 2^100). Walau bagaimanapun, ia dikenakan penalti pengiraan disebabkan oleh operasi mod(). Oleh itu, ia disyorkan hanya jika penjana nombor rawak sangat perlahan.
Atas ialah kandungan terperinci ## Bagaimanakah anda menjana nilai BigInteger rawak dalam julat tertentu dalam Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!