>  기사  >  Java  >  Java의 특정 범위 내에서 임의의 BigInteger 값을 생성하는 방법은 무엇입니까?

Java의 특정 범위 내에서 임의의 BigInteger 값을 생성하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-25 03:51:45743검색

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

Java의 특정 범위 내에서 임의의 BigInteger 값 생성

Java 프로그래밍에서 지정된 범위 내에서 임의의 BigInteger 값을 생성하려면 균일한 분포와 계산 효율성을 보장하기 위해 신중한 고려가 필요합니다. . 처음에는 nextDouble의 결과에 상한을 곱하는 방법을 사용할 수 있지만 배정밀도 제한(253)을 초과하는 값을 처리할 때 이 접근 방식은 문제가 됩니다.

이 문제를 해결하려면 문제의 경우 BigInteger 클래스는 적합한 생성자를 제공합니다.

public BigInteger(int numBits, Random rnd)

이 생성자는 0에서 (2numBits - 1) 범위 내에서 임의의 BigInteger를 생성하여 균일한 배포를 보장합니다. 그러나 원하는 범위(0~n) 내에서 값을 얻는 것이 과제로 남아 있습니다. 여기서 n은 반드시 2의 거듭제곱은 아닙니다.

해결책:

효과적인 해결책은 루프를 사용하는 것입니다.

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

평균적으로 이 루프는 두 번 미만으로 실행되어 균일한 배포를 보장합니다.

비싼 RNG에 대한 최적화:

선택한 RNG가 계산 집약적인 경우 반복 횟수가 제한될 수 있습니다.

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

이 버전은 루프가 두 번 이상 통과될 가능성을 크게 줄입니다(2분의 1 미만100). 그러나 mod() 작업은 계산 비용이 많이 들기 때문에 이 최적화는 RNG 인스턴스가 특히 느린 경우에만 도움이 될 수 있습니다.

위 내용은 Java의 특정 범위 내에서 임의의 BigInteger 값을 생성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.