Why is my random number generator returning negative values

I made a very simple linear congruent generator (or at least I think I have), however it returns some crazy values, including negative numbers. I can’t let my life determine why, any help is greatly appreciated. My code is below:

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();
}
+4
source share
2 answers

Because it System.currentTimeMillis()returns the current time in milliseconds.
That way, it can return large numbers, such as 1508797287829.

Multiplying a number such as 1508797287829by 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));
+1

. java int long 2 ^ 63-1, - , . , ,

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

.

+1

Source: https://habr.com/ru/post/1688041/


All Articles