지정된 범위 내에서 임의로 큰 임의의 정수를 생성해야 하는 시나리오에서 일반적인 접근 방식은 nextDouble()을 사용하고 다음을 곱하는 것입니다. 원하는 한도로 출력합니다. 그러나 이 방법은 2^53을 초과하는 값에 대해 문제가 되어 균일하지 않은 분포로 이어집니다.
이러한 제한을 극복하기 위해 Java는 0과 0 사이에 균일하게 분포된 난수를 생성하는 생성자를 제공하는 BigInteger 클래스를 제공합니다. (2^numBits - 1), 포함.
0부터 n까지의 범위에서 무작위 값을 생성하려면(여기서 n) 2의 거듭제곱이 아닌 경우 간단한 루프를 사용할 수 있습니다.
<code class="java">BigInteger randomNumber; do { randomNumber = new BigInteger(upperLimit.bitLength(), randomSource); } while (randomNumber.compareTo(upperLimit) >= 0);</code>
이 반복 접근 방식은 원하는 범위 내에서 균일한 분포를 보장합니다. 일반적으로 한두 번의 반복만 필요합니다.
난수 생성기의 계산 비용이 많이 드는 시나리오의 경우 루프의 반복 횟수를 다음과 같이 제한할 수 있습니다. :
<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^100 미만). 그러나 mod() 작업으로 인해 계산상의 패널티가 발생합니다. 따라서 난수 생성기가 특히 느린 경우에만 권장됩니다.
위 내용은 ## Java의 특정 범위 내에서 임의의 BigInteger 값을 어떻게 생성합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!