4

如何between 0 and 2^32-1在java中生成随机数?我写这个链接:

long[]num = new long[size + 1];
Random random = new Random();
for (int i = 1; i < size + 1; i++) {
num[i] = (long)random.nextInt()+(long)(1<<31);
System.out.println(num[i]);
}

但它打印

-1161730240
-1387884711
-3808952878
-3048911995
-2135413666

我不知道为什么..

4

2 回答 2

8

如果你想要从 0 到 2^32-1,那么你应该使用Random.nextLong() & 0xffffffffL而不是Random.nextInt().

Java 不支持unsigned类型,这意味着你int不能在你想要的范围内取值。为了解决这个问题,您使用 64 位的 along并且可以在所需范围内取值。

于 2012-10-07T11:21:35.853 回答
4

您的问题是您尝试添加偏移量以避免负数。

(long)(1<<31)

将 1 解释为 int,将其移动 31 位,使其成为最大的负 int,然后将其转换为 long(仍然为负)。

你要

(1L << 31)

作为你的抵消。

于 2012-10-07T11:25:56.030 回答