java - 如何在 Java 中生成随机 BigInteger 值?

标签 java random biginteger

我需要在 0(包括)到 n(不包括)范围内生成任意大的随机整数。我最初的想法是调用nextDouble并乘以 n,但一旦 n 大于 253,结果将不再均匀分布。

BigInteger有以下可用的构造函数:

public BigInteger(int numBits, Random rnd)

Constructs a randomly generated BigInteger, uniformly distributed over the range 0 to (2numBits - 1), inclusive.

如何使用它来获得 0 - n 范围内的随机值,其中 n 不是 2 的幂?

最佳答案

使用循环:

BigInteger randomNumber;
do {
    randomNumber = new BigInteger(upperLimit.bitLength(), randomSource);
} while (randomNumber.compareTo(upperLimit) >= 0);

平均而言,这将需要少于两次的迭代,并且选择是统一的。

编辑:如果您的 RNG 很昂贵,您可以通过以下方式限制迭代次数:

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);
// result is in 'randomNumber'

在这个版本中,循环被多次执行的可能性很小(在 2^100 中小于一次机会,即远小于主机自发着火的概率下一秒)。另一方面,mod() 操作的计算量很大,所以这个版本可能比以前的版本慢,除非 randomSource 实例特别慢。

关于java - 如何在 Java 中生成随机 BigInteger 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2290057/

相关文章:

java - 如何在 Java 中获取项目路径?

python - 在 Python 中生成随机 16 位数字

c++ - C/C++多线程程序使用rand_r的正确方法

c# - C# 中的 BigInteger 除法

c++ - 如何将 Biginteger 转换为字符串

java - 为什么 JPA 需要域对象的无参数构造函数?

java - 如果设置为任何目录,我可以从类路径加载资源吗?

Java随机类,只需要随机化0,10,20,30,40,50而不是该范围内的任何数字

java - Java Biginteger 在 pow 中的最大值

java - 在 py4j 中使用整个 eclipse 项目