我有一个简单的问题,我对随机数生成有点生疏。我想生成大的奇数整数(我使用双精度,因为我的数字可能在int范围之外)而且我无法弄清楚如何摆脱随机数生成中的小数并且数字是奇数。
现在我只有:
N = nMin + (nMax - nMin) * rand.nextDouble();
正如我所说,在nMin和nMax之间给出了任意随机数(带小数)。任何帮助将非常感激!
答案 0 :(得分:6)
如果你的数字可能超出了int范围,那么你应该使用long
,或者使用BigInteger
失败。
使用this question中的信息创建一个随机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 - 返回
的bitLengthBigInteger
。- rnd - 用于选择要测试素数的候选者的随机位源。
<强>返回:强>
BigInteger
bitLength位,可能是素数
如果它可能是素数,它也可能很奇怪。
答案 1 :(得分:1)
(long)(expression)
会将expression
转换为long
(64位整数),截断小数(从而有效地舍入为零)。创建奇数可以通过首先创建一个整数然后乘以两个并添加一个(令人尴尬的编辑)来完成。 (你可能能够自己调整nMin
和nMax
的方式进行数学计算。:-))
答案 2 :(得分:0)
摆脱小数是一个常见问题。一个技巧是乘以100,然后将结果转换为int(或long)。这是一个让你熟悉的好习惯!!