2012-09-11 64 views
0

我有一个简单的问题,我对随机数生成有点生疏。我想生成大的奇数整数(我使用双打,因为我的数字可能在int范围之外),我不能完全弄清楚如何摆脱随机数生成中的小数,并且数字是奇数。Java限制随机双数

现在我只是有:

N = nMin + (nMax - nMin) * rand.nextDouble(); 

正如我所说的,给了我和无机氮之间nMax的任何随机数(带小数)。任何帮助将非常感激!

+2

“int范围之外” - “long”之外? – Mysticial

+0

是的,它需要是双重的 –

+0

在这种情况下,您可能有设计问题。如果你生成一个统一的整数分布,其长度将超过“长”,那么生成的数字足够小(并且因此足够精确)以“双”来区分奇数和偶数的概率将会是消失得很小。 – Mysticial

回答

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

参数:

  • 位长度 - 返回BigInteger的位长。
  • rnd - 随机比特的来源,用于选择要进行素数测试的候选对象。

返回:

  • 位长度的位BigInteger这可能是黄金

如果它可能是黄金,它也可能是奇数。

+0

我想我明白这一点。我如何将范围设置为任何给定的最小值而不是0? –

+0

我添加了一些代码,应该做的伎俩,或者至少让你开始。我可能会在'max'附近看到一个边缘案例,但我确定找出bug和边缘案例是可以解决的问题。 – corsiKa

+0

您可以执行'result.or(BigInteger.ONE)'。 – oldrinb

0

摆脱小数是一个常见问题。一个技巧是乘以100,然后将结果转换为int(或long)。这对你来说很熟悉!

+0

不能做一个int cast - 他说它会超出int范围。 – corsiKa

1

(long)(expression)会将expression转换为long(64位整数),截断小数(因此实际上舍入为零)。创建奇数可以通过首先创建一个整数,然后乘以两个并添加一个(令人尴尬的编辑)来完成。 (你可能能够做数学题,你需要如何调整nMinnMax自己。:-))

+2

“创建奇数可以通过先创建一个整数然后再乘以2来完成。”这是_even_数字:) –

+0

您可以创建奇数乘以两个_then_加1(乘以两个保证它是偶数,然后加一保证它变成奇数)。 – Brian

+0

@martinclayton:诅咒,我一定是太累了 - 现在修好了。 –