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