【问题标题】:JAVA Random.nextInt(int n) returning 0 for n >= 2^16JAVA Random.nextInt(int n) 为 n >= 2^16 返回 0
【发布时间】:2014-11-19 19:17:31
【问题描述】:

我有点困惑。只要 i 是 16 及以上,mit 随机选择 x 为 0。怎么会?

Random random  = new Random();
    for(int i = 1; i < 20; i++)
    {
        int[] input = generateArray( (int)Math.round(Math.pow(2, i)), (int)Math.round(Math.pow(2, i+i)) );
        int x = input[random.nextInt(input.length-1)];
        System.out.println(BinarySearch.go(input, x));
    }

对不起,我忘了给你看 generateArray:

public static int[] generateArray(int amount, int max)
{
    int[] randomNumbers = new int[amount];
    double delta = max / (float)amount;
    Random random = new Random();
    for (int i = 0; i < randomNumbers.length; i++) {
        randomNumbers[i] = (int)Math.round(i*delta + random.nextDouble() * delta);
    }
    return randomNumbers;
}

基本上生成一个长度为amount的int数组,并用随机(bound = amount * 2)找到的递增整数填充它。

【问题讨论】:

  • input 包含什么?
  • 什么是generateArray

标签: java random integer


【解决方案1】:

generateArray 的第二个参数的增长速度比第一个 i+i 快。在 16 位,实际上 231 - 1 你溢出 int,

public static void main(String[] args) {
    for (int i = 15; i < 20; i++) {
        long a = Math.round(Math.pow(2, i));
        long b = Math.round(Math.pow(2, i + i));
        int c = (int) b;
        System.out.printf("i = %d, a = %d, b = %d, c = %d%n", i, a, b, c);
    }
}

输出是

i = 15, a = 32768, b = 1073741824, c = 1073741824
i = 16, a = 65536, b = 4294967296, c = 0
i = 17, a = 131072, b = 17179869184, c = 0
i = 18, a = 262144, b = 68719476736, c = 0
i = 19, a = 524288, b = 274877906944, c = 0

【讨论】:

  • 谢谢,愚蠢的我!本来是i+1 而不是i+i。干杯!
【解决方案2】:

考虑

Math.round(Math.pow(2, i + i))

其中i = 16(如果i 大于16,则结果相似)。

2^32,在二进制中可以表示为

<leading 0s>1 00000000 00000000 00000000 00000000

这是一个long,它不适合int。您执行强制转换,丢弃前导位,并获得 int0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    相关资源
    最近更新 更多