我有一个简单的问题,我对随机数生成有点生疏。我想生成大的奇数整数(我使用双打,因为我的数字可能在int范围之外),我不能完全弄清楚如何摆脱随机数生成中的小数,并且数字是奇数。Java限制随机双数
现在我只是有:
N = nMin + (nMax - nMin) * rand.nextDouble();
正如我所说的,给了我和无机氮之间nMax的任何随机数(带小数)。任何帮助将非常感激!
我有一个简单的问题,我对随机数生成有点生疏。我想生成大的奇数整数(我使用双打,因为我的数字可能在int范围之外),我不能完全弄清楚如何摆脱随机数生成中的小数,并且数字是奇数。Java限制随机双数
现在我只是有:
N = nMin + (nMax - nMin) * rand.nextDouble();
正如我所说的,给了我和无机氮之间nMax的任何随机数(带小数)。任何帮助将非常感激!
如果你的号码可以走出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
。参数:
- 位长度 - 返回
BigInteger
的位长。- rnd - 随机比特的来源,用于选择要进行素数测试的候选对象。
返回:
- 位长度的位
BigInteger
这可能是黄金
如果它可能是黄金,它也可能是奇数。
(long)(expression)
会将expression
转换为long
(64位整数),截断小数(因此实际上舍入为零)。创建奇数可以通过首先创建一个整数,然后乘以两个并添加一个(令人尴尬的编辑)来完成。 (你可能能够做数学题,你需要如何调整nMin
和nMax
自己。:-))
“创建奇数可以通过先创建一个整数然后再乘以2来完成。”这是_even_数字:) –
您可以创建奇数乘以两个_then_加1(乘以两个保证它是偶数,然后加一保证它变成奇数)。 – Brian
@martinclayton:诅咒,我一定是太累了 - 现在修好了。 –
“int范围之外” - “long”之外? – Mysticial
是的,它需要是双重的 –
在这种情况下,您可能有设计问题。如果你生成一个统一的整数分布,其长度将超过“长”,那么生成的数字足够小(并且因此足够精确)以“双”来区分奇数和偶数的概率将会是消失得很小。 – Mysticial