随机化BigInteger

Unr*_*ega 4 java random biginteger

我想随机化一个BigInteger.目的是从1到8180385048中选择一个数字.虽然,从我注意到,BigInteger(BitLen,Random)从n到X 2 -1,我想要一些不可预测的数字.我试图制作一个可以做到这一点的方法,但是我一直遇到错误并最终放弃在这里询问.:P有没有人对如何做这个有任何建议?

aio*_*obe 5

Random.nextInt(int n)显然需要解决相同问题的文档来看,他们似乎已经得出结论,你不能做得比"重新取样超出范围"更好,但预计惩罚可以忽略不计.

来自文档:

该算法有点棘手.它拒绝会导致分布不均匀的值(由于2 31不能被n整除).值被拒绝的概率取决于n.最坏的情况是n = 2 30 +1,其中拒绝的概率是1/2,并且循环终止之前的预期迭代次数是2.

我建议您只使用您提到的随机化构造函数并迭代,直到达到范围内的值,例如:

public static BigInteger rndBigInt(BigInteger max) {
    Random rnd = new Random();
    do {
        BigInteger i = new BigInteger(max.bitLength(), rnd);
        if (i.compareTo(max) <= 0)
            return i;
    } while (true);
}

public static void main(String... args) {
    System.out.println(rndBigInt(new BigInteger("8180385048")));
}
Run Code Online (Sandbox Code Playgroud)

对于你的特殊情况(max = 8180385048),不得不重复,甚至一次的概率约为4.8%,所以不用担心:-)