Java限制随机加倍

时间:2012-09-11 21:40:54

标签: java

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

现在我只有:

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

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

3 个答案:

答案 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 - 返回BigInteger
  • 的bitLength   
  • rnd - 用于选择要测试素数的候选者的随机位源。
  •   
     

<强>返回:

     
      
  • BigInteger bitLength位,可能是素数
  •   

如果它可能是素数,它也可能很奇怪。

答案 1 :(得分:1)

(long)(expression)会将expression转换为long(64位整数),截断小数(从而有效地舍入为零)。创建奇数可以通过首先创建一个整数然后乘以两个并添加一个(令人尴尬的编辑)来完成。 (你可能能够自己调整nMinnMax的方式进行数学计算。:-))

答案 2 :(得分:0)

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