0

我有一个简单的问题,我对随机数生成有点生疏。我想生成大的奇数整数(我使用双精度数,因为我的数字可能超出 int 范围),但我不知道如何在随机数生成中去掉小数并让数字为奇数。

现在我只有:

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

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

4

3 回答 3

6

如果您的数字可能超出 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位

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

于 2012-09-11T21:44:37.407 回答
1

(long)(expression)expression转换为long(一个 64 位整数),截断小数(因此有效地向零舍入)。创建奇数可以通过首先创建一个整数然后将其乘以 2并加 1来完成(令人尴尬的编辑)。(您可能能够计算出您需要如何调整nMinnMax自己。:-))

于 2012-09-11T21:43:15.873 回答
0

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

于 2012-09-11T21:43:04.880 回答