Unr*_*ega 4 java random biginteger
我想随机化一个BigInteger.目的是从1到8180385048中选择一个数字.虽然,从我注意到,BigInteger(BitLen,Random)从n到X 2 -1,我想要一些不可预测的数字.我试图制作一个可以做到这一点的方法,但是我一直遇到错误并最终放弃在这里询问.:P有没有人对如何做这个有任何建议?
从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%,所以不用担心:-)