java90到100随机数⽣成器_Java随机数⽣成器
是否可以让⽤户选择⼀个随机数的位数,特别是⼀个随机的⼤整数? 例如,如果⽤户希望长度为15位,则随机数⽣成器将只⽣成15位长的Big Integer。
看看Jon Skeets对stackoverflow/questions/2290057/的回答
您可以使⽤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 {java生成随机数的方法
r = new BigInteger(100, rnd).remainder(tenPow30);
} while (rpareTo(min) < 0);
System.out.println(r);
链接到演⽰。
是什么阻⽌上述代码⽣成不是30位数字的0结果?
@codaddict可以说是30位零的30位随机数。如果您不希望30位数字中的前导零,则始终可以循环运⾏它。
是的,不仅需要检查所有零,还需要检查1 ^ 30以下⽣成的任何数字。
@codaddict我添加了⼀个循环以确保数字的前导位置不包含零。
循环运⾏它可以使它以适当的随机值⽆限循环。我同意@codaddict的观点,实际上,如果String().length() < digits为true,则需要再次运⾏此代码。实际上,发⽣环路的可能性⼏
乎为50%。
@Brian这就是代码在不将其转换为字符串的情况下所要做的。仅当随机数⽣成器⽆限坏时,该代码才能⽆限运⾏。
@dasblinkenlight毕竟,这不是⼀个很好的解决⽅案,因为所花费的时间是任意的,并且⽆法在不知道RNG确切概率的情况下进⾏计算。最好简单地检查第⼀个数字是否为0,如果不是,则在其位置放⼀个不同的随机⾮零数字。
@Brian可以先⽣成⼀个29位数字,再⽣成⼀个1位数字,然后将它们组合为30位数字,⽽⽆需进⾏任何检查。
我想我更喜欢29 + 1的⽅法,因为您可以肯定只需要运⾏⼀次代码。
您始终可以随机⽣成数字的各个数字。这样,对于15位数字,您可以随机⽣成15位数字,然后形成数字。
其他⽅式:
让我们更改问题以⽣成随机的5位数字。
Min = 10000
Max = 99999
现在在0和Max - Min之间⽣成⼀个随机数,即0和89999,并将其添加到Min。
Random = Min + Math.random() * (Max - Min)
我喜欢这个简单的解决⽅案!没有循环或其他任何东西,只是简单⽽简单的数学:)
步骤如下:
产⽣n个数字
使⽤StringBuilder组合它们
使⽤BigInteger(String)创建您的号码
这是⼀些代码:
public static BigInteger randomBigInt(int digits, Random rand) {
StringBuilder sb = new StringBuilder(digits);
// First digit can't be 0
sb.Int(9) + 1);
int limit = digits - 1;
for (int i = 0; i < limit; i++)
sb.Int(10));
return new String());
}
这将分别⽣成每个数字并将其添加到StringBuilder(⽽不是int之类的东西,这可能会产⽣缓冲区溢出问题),然后使⽤⽣成的String创建BigInteger。另请注意,第⼀位永远不会为0。
嗯,这个答案可以计算⼩于n位数字的数字。⽣病了改变我的答案。抱歉:X
在那⾥,我修复了它。
使⽤类似于此处的RandomUtil类的Random Generator,您可以在⼀些值和更多值之间创建随机数。
例如,使⽤此代码的范围为15位数字
最⼩值= 100000000000000最⼤值= 999999999999999:
BigInteger number = RandomBigInteger(new BigInteger("100000000000000"), new
BigInteger("999999999999999"), false);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论