Java随机数生成器

时间:2012-09-15 18:25:39

标签: java random biginteger

是否可以让用户选择随机数的位数,特别是随机的Big Integer?例如,如果用户希望它长15位,则随机数生成器将仅生成15位长的大整数。

4 个答案:

答案 0 :(得分:5)

您可以使用BigInteger的构造函数来指定二进制数字的位数:BigInteger(int numBits, Random rnd)。对于用户想要的每三个十进制数字,您需要大约十位二进制数字。例如,如果您需要30位随机BigInt,请使用100个二进制数字。

您可以使用remainder(10^30)切断不必要的数字,然后循环执行以确保初始数字不为零,确保正确的位数,如下所示:

Random rnd = new Random(123);
BigInteger tenPow30 = new BigInteger("10").pow(30);
BigInteger min = new BigInteger("10").pow(29);
BigInteger r;
do {
        r = new BigInteger(100, rnd).remainder(tenPow30);
} while (r.compareTo(min) < 0);
System.out.println(r);

链接到demo

答案 1 :(得分:4)

您始终可以随机生成该数字的个别数字。这样,对于15位数字,您可以随机生成15位数字,然后形成数字。

另一种方式:

让我们更改问题以生成随机的5位数字。

Min = 10000
Max = 99999

现在生成0Max - Min之间的089999之间的随机数,并将其添加到Min

Random = Min + Math.random() * (Max - Min)

答案 2 :(得分:0)

以下是步骤:

  1. 生成n个数字
  2. 使用StringBuilder
  3. 组合它们
  4. 使用BigInteger(String)
  5. 创建您的号码

    这里有一些代码:

    public static BigInteger randomBigInt(int digits, Random rand) {
        StringBuilder sb = new StringBuilder(digits);
    
        // First digit can't be 0
        sb.append(rand.nextInt(9) + 1);
    
        int limit = digits - 1;
        for (int i = 0; i < limit; i++)
            sb.append(rand.nextInt(10));
    
        return new BigInteger(sb.toString());
    }
    

    这会分别生成每个数字,并将它们添加到StringBuilder(而不是int或其他东西,这会产生缓冲区溢出问题),然后使用结果String创建BigInteger。另请注意,第一个数字永远不会为0。

答案 3 :(得分:-1)

使用像here RandomUtil class这样的随机生成器,您可以在某些值和更多值之间创建随机数。

例如,使用此代码的范围是15位数 min = 100000000000000 max = 999999999999999:

BigInteger number = RandomUtil.getRandomBigInteger(new BigInteger("100000000000000"), new BigInteger("999999999999999"), false);