生成15位随机数时,最后3位数始终为零

时间:2015-01-25 14:09:42

标签: java random

我想使用Java在1_000_0000_0000_0009_999_9999_9999_999L之间生成一个随机数,所以我使用了以下代码,

final long MAX_NUMBER = 9_999_9999_9999_999L;
final long MIN_NUMBER = 1_000_0000_0000_000L;
System.out.print(Long.valueOf(new Random().nextLong() * 
                     (MAX_NUMBER - MIN_NUMBER)));

代码的问题是,代码确实产生了15位数的随机数,但最后的3位数总是为零,有时它产生负数。

有人可以告诉我为什么最后的3位数总是为零吗?

以下是一些输出

7160629848698886104000

-6581075034034719564000

6645937379553681443000

6363833355925386903000

2 个答案:

答案 0 :(得分:3)

nextLong()可能会返回任何长值,包括负值。将nextLong()的结果乘以(MAX_NUMBER - MIN_NUMBER)可能会导致溢出,并且不会在所需范围内给出结果。

您可以改为使用Math.random()

System.out.print((long)(Math.random() * (MAX_NUMBER - MIN_NUMBER))+ MIN_NUMBER);

答案 1 :(得分:2)

奇怪,我无法重现你的问题。看起来JVM的随机数生成是有缺陷的吗?您可以尝试SecureRandom而不是随机。

顺便说一下,我只想注意Math.random() * (max - min) + min模式不会导致均匀分布(尽管它已接近)。

您可以试用Apache Commons:RandomDataGenerator。 它有一个nextLong(long lower, long upper)实现。

https://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math3/random/RandomDataGenerator.html