在 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>
此版本显着降低了循环遍历多次的可能性(小于二分之一100)。然而,mod() 操作的计算成本很高,因此这种优化只有在 RNG 实例特别慢的情况下才有用。
以上是如何在Java中生成特定范围内的随机BigInteger值?的详细内容。更多信息请关注PHP中文网其他相关文章!