Java随机数发生器
是否可以让用户选择随机数的位数,特别是随机大整数?例如,如果用户希望其长度为15位数,则随机数生成器将只生成15位数的大整数 您始终可以随机生成数字的各个数字。这样,对于15位数字,您可以随机生成15位数字,然后形成数字 另一种方式: 让我们将问题更改为生成随机的5位数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) 您可
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。以下是步骤:
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位数的数字。我会改变我的答案。抱歉:我喜欢这个简单的解决方案!没有循环之类的,只是简单明了的数学:)