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 중국어 웹사이트의 기타 관련 기사를 참조하세요!