Rumah >Java >javaTutorial >Bagaimana untuk Menjana Nilai BigInteger Rawak dalam Julat Tertentu di Jawa?

Bagaimana untuk Menjana Nilai BigInteger Rawak dalam Julat Tertentu di Jawa?

Barbara Streisand
Barbara Streisandasal
2024-10-25 03:51:45849semak imbas

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

Menjana Nilai Integer Besar Rawak dalam Julat Tertentu dalam Java

Dalam pengaturcaraan Java, menjana nilai BigInteger rawak dalam julat yang ditetapkan memerlukan pertimbangan yang teliti untuk memastikan pengedaran seragam dan kecekapan pengiraan . Seseorang pada mulanya mungkin menggunakan untuk mendarab hasil nextDouble dengan had atas, tetapi pendekatan ini menjadi bermasalah apabila berurusan dengan nilai melebihi had ketepatan berganda (253).

Untuk menangani perkara ini isu, kelas BigInteger menyediakan pembina yang sesuai:

public BigInteger(int numBits, Random rnd)

Pembina ini menjana BigInteger rawak dalam julat 0 hingga (2numBits - 1), memastikan pengedaran seragam. Walau bagaimanapun, cabaran kekal dalam mendapatkan nilai dalam julat yang dikehendaki (0 hingga n), di mana n tidak semestinya kuasa 2.

Penyelesaian:

Satu yang berkesan penyelesaiannya ialah menggunakan gelung:

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

Secara purata, gelung ini akan dilaksanakan kurang daripada dua kali, memastikan pengedaran seragam.

Pengoptimuman untuk RNG Mahal:

Jika RNG yang dipilih adalah intensif secara pengiraan, bilangan lelaran boleh dihadkan:

<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 ini mengurangkan dengan ketara kemungkinan gelung dilalui lebih daripada sekali (kurang daripada 1 dalam 2100). Walau bagaimanapun, operasi mod() adalah mahal dari segi pengiraan, jadi pengoptimuman ini mungkin hanya bermanfaat jika tika RNG sangat perlahan.

Atas ialah kandungan terperinci Bagaimana untuk Menjana Nilai BigInteger Rawak 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