我有一个简单的问题,我对随机数生成有点生疏。我想生成大的奇数整数(我使用双精度数,因为我的数字可能超出 int 范围),但我不知道如何在随机数生成中去掉小数并让数字为奇数。
现在我只有:
N = nMin + (nMax - nMin) * rand.nextDouble();
正如我所说,这给了我 nMin 和 nMax 之间的任何随机数(带小数)。任何帮助将非常感激!
我有一个简单的问题,我对随机数生成有点生疏。我想生成大的奇数整数(我使用双精度数,因为我的数字可能超出 int 范围),但我不知道如何在随机数生成中去掉小数并让数字为奇数。
现在我只有:
N = nMin + (nMax - nMin) * rand.nextDouble();
正如我所说,这给了我 nMin 和 nMax 之间的任何随机数(带小数)。任何帮助将非常感激!
如果您的数字可能超出 int 范围,那么您应该使用long
,或失败,BigInteger
。
使用此问题中的信息创建一个 random BigInteger
,如果它甚至只是简单地添加 1 。
BigInteger randomOdd(BigInteger min, BigInteger max) {
BigInteger range = max.subtract(min);
// expected iterations: 2 - max iterations: infinite
BigInteger tmp;
do {
tmp = new BigInteger(n.bitLength(), rng); // rng is your Random Number Generator
} while (tmp.compareTo(range) >= 0);
BigInteger result = min.add(tmp);
// force the result to be odd
// TODO: will this push it over max?
result = result.or(BigInteger.ONE);
return result;
}
或者,您可以使用 BigInteger 类上的方法BigInteger.probablePrime()
:
public static BigInteger probablePrime(int bitLength, Random rnd)
返回一个
BigInteger
可能是素数的正数,带有指定的bitLength
. 此方法返回的 BigInteger 是复合的概率不超过2^100
。参数:
- bitLength - 返回的位长度
BigInteger
。- rnd - 随机位的来源,用于选择要测试素性的候选者。
回报:
BigInteger
可能是素数的 bitLength位
如果它可能是素数,它也可能是奇怪的。
(long)(expression)
将expression
转换为long
(一个 64 位整数),截断小数(因此有效地向零舍入)。创建奇数可以通过首先创建一个整数然后将其乘以 2并加 1来完成(令人尴尬的编辑)。(您可能能够计算出您需要如何调整nMin
和nMax
自己。:-))
摆脱小数是一个常见的问题。一个技巧是乘以 100,然后将该结果转换为 int(或 long)。这是你熟悉的好习惯!!