Rumah  >  Artikel  >  Java  >  Bagaimana untuk Menjana Nilai Integer Besar Rawak Teragih Seragam dalam Julat Tertentu di Jawa?

Bagaimana untuk Menjana Nilai Integer Besar Rawak Teragih Seragam dalam Julat Tertentu di Jawa?

Linda Hamilton
Linda Hamiltonasal
2024-10-25 02:46:02810semak imbas

How to Generate Uniformly Distributed Random BigInteger Values within a Specific Range in Java?

Menjana Nilai Integer Besar Rawak dalam Java

Di Java, menjana integer rawak dalam julat yang ditentukan boleh mencabar apabila berurusan dengan nombor yang besar. Isu timbul apabila menggunakan kaedah konvensional seperti nextDouble() untuk penjanaan nombor rawak, kerana nilai yang dijana mungkin tidak diedarkan secara seragam melebihi had 253.

Menggunakan BigInteger Constructor

Untuk menangani perkara ini, kelas BigInteger menyediakan pembina yang membolehkan penciptaan nilai BigInteger rawak diedarkan secara seragam dalam julat bit tertentu.

Membina Pembina BigInteger:

<code class="java">public BigInteger(int numBits, Random rnd)</code>

Pembina ini mengambil dua parameter:

  • numBits: Menentukan bilangan bit untuk nilai yang dijana
  • rnd: Objek Rawak yang digunakan untuk menjana nilai rawak

Menjana Nilai Rawak Dalam Julat

Untuk menjana nilai rawak dalam julat bukan kuasa-2 0 hingga n (termasuk), gelung boleh digunakan:

<code class="java">BigInteger randomNumber;
do {
    randomNumber = new BigInteger(upperLimit.bitLength(), randomSource);
} while (randomNumber.compareTo(upperLimit) >= 0);</code>

Gelung ini berulang sehingga nilai rawak yang sah diperolehi. Ia memastikan bahawa nilai yang dijana diedarkan secara seragam dalam julat yang ditentukan.

Mengoptimumkan Kiraan Lelaran

Untuk mengurangkan bilangan lelaran gelung, penyelesaian yang lebih halus boleh digunakan .

<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>

Pendekatan ini termasuk had pada bilangan lelaran untuk mengelakkan pelaksanaan gelung yang berlebihan. Ia mengimbangi kelajuan dan ketepatan, mengurangkan kemungkinan bilangan lelaran yang banyak.

Atas ialah kandungan terperinci Bagaimana untuk Menjana Nilai Integer Besar Rawak Teragih Seragam dalam Julat Tertentu di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn