首页  >  文章  >  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>

此版本显着降低了循环遍历多次的可能性(小于二分之一100)。然而,mod() 操作的计算成本很高,因此这种优化只有在 RNG 实例特别慢的情况下才有用。

以上是如何在Java中生成特定范围内的随机BigInteger值?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn