Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java随机数发生器_Java_Random_Biginteger - Fatal编程技术网

Java随机数发生器

Java随机数发生器,java,random,biginteger,Java,Random,Biginteger,是否可以让用户选择随机数的位数,特别是随机大整数?例如,如果用户希望其长度为15位数,则随机数生成器将只生成15位数的大整数 您始终可以随机生成数字的各个数字。这样,对于15位数字,您可以随机生成15位数字,然后形成数字 另一种方式: 让我们将问题更改为生成随机的5位数 Min = 10000 Max = 99999 现在生成一个介于0和Max-Min之间的随机数,即0和89999,并将其添加到Min Random = Min + Math.random() * (Max - Min) 您可

是否可以让用户选择随机数的位数,特别是随机大整数?例如,如果用户希望其长度为15位数,则随机数生成器将只生成15位数的大整数

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

另一种方式:

让我们将问题更改为生成随机的5位数

Min = 10000
Max = 99999
现在生成一个介于
0
Max-Min
之间的随机数,即
0
89999
,并将其添加到
Min

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

您可以使用
biginger
的构造函数,其中指定二进制位数:。用户需要的每三个十进制数字大约需要十个二进制数字。例如,如果您需要一个30位的随机
BigInt
,请使用100位二进制数字

您可以使用
余数(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);
Random rnd=新随机数(123);
BigInteger tenPow30=新的BigInteger(“10”).pow(30);
BigInteger最小值=新的BigInteger(“10”)。功率(29);
大整数r;
做{
r=新的大整数(100,rnd)。余数(tenPow30);
}而(r.compareTo(min)<0);
系统输出println(r);
链接到a。

以下是步骤:

  • 生成n个数字
  • 使用
    StringBuilder将它们组合起来
  • 使用创建您的号码
  • 下面是一些代码:

    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());
    }
    
    publicstaticbiginger randomBigInt(整数位数,随机rand){
    StringBuilder sb=新的StringBuilder(数字);
    //第一个数字不能是0
    sb.追加(兰特·奈克斯汀(9)+1);
    整数极限=位数-1;
    对于(int i=0;i

    这将分别生成每个数字,并将它们添加到
    StringBuilder
    (与
    int
    或可能产生缓冲区溢出问题的东西相反),然后使用生成的
    String
    创建
    biginger
    。还请注意,第一个数字永远不会是0。

    使用类似随机生成器的方法,可以在某些值和更多值之间生成随机数

    例如,使用此代码的长度范围为15位 最小值=1000000000000最大值=999999999999:

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

    看看Jon Skeet的答案,是什么阻止了上述代码生成一个
    0
    ,这不是一个30位数的数字?@codaddict可以说,这是一个有30个零的30位数随机数。如果您不希望在30位数字中包含前导零,则始终可以在循环中运行它。是的,不仅需要对所有零进行检查,而且需要对1^30以下生成的任何数字进行检查。@codaddict我添加了一个循环,以确保数字的前导位置没有零。在循环中运行它可以使它以适当的随机数无限循环价值观我同意@codaddict的说法,如果
    biginger.toString().length()
    为真,则需要再次运行此代码。循环发生的概率几乎是50%。啊,这个答案可以计算出小于n位数的数字。我会改变我的答案。抱歉:我喜欢这个简单的解决方案!没有循环之类的,只是简单明了的数学:)