为什么我的随机数生成器返回负值

时间:2017-10-23 22:18:28

标签: java random

我已经制作了一个非常基本的线性同余发生器(或者至少我认为我有)但是它会返回一些疯狂的值,包括负数。我不能为我的生活找出原因,任何帮助都非常欢迎。我的代码如下:

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    long a = 252149039;
    int c = 11;
    long m =(long) Math.pow(2, 48);
    long seed = System.currentTimeMillis();
    System.out.println("How many Random numbers would you like to get?");
    int number = scanner.nextInt();
    for (int i = 0; i <= number;i++) {
        seed = ((a*seed)+c) % m;
        System.out.println(seed);
    }
    scanner.close();
}

2 个答案:

答案 0 :(得分:1)

您收到溢出错误。 java int long只能保存最大值为2 ^ 63-1的值,任何大于该值的值。这项工作如何处理两个赞美整数表示的机制,以及最短的修复将是添加

seed = seed >= 0 ? seed : seed + m

在您打印种子之前。

答案 1 :(得分:1)

因为System.currentTimeMillis()以毫秒为单位返回当前时间。
因此,它可能返回大数字,例如1508797287829

1508797287829之类的数字乘以252149039(= 380441786171888746331):

... 
long a = 252149039;
long seed = System.currentTimeMillis();
...
seed = ((a*seed)+c) % m;

long seed变量生成溢出,Long.MAX_VALUE定义为2^63 - 1(= 9223372036854775807)。

要表示任意精度的整数,可以使用BigInteger
请注意,该类是不可变的。

您可以将seed声明为BigInteger

BigInteger seed = BigInteger.valueOf(System.currentTimeMillis());

以这种方式使用它:

seed = seed.multiply(BigInteger.valueOf(a))
           .add(BigInteger.valueOf(c))
           .mod(BigInteger.valueOf(m));