在需要生成指定范围内的任意大随机整数的情况下,常见的方法可能涉及使用 nextDouble() 并相乘输出达到所需的限制。但是,对于超过 2^53 的值,此方法会出现问题,导致分布不均匀。
为了克服此限制,Java 提供了 BigInteger 类,该类提供了一个构造函数,可以生成在 0 到 0 之间均匀分布的随机数(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中文网其他相关文章!