Как работает java.util.random?
Чтобы понять, как работает java.util.random, я написал фрагмент простого кода для имитации случайных функций java и сравнил результаты случайных функций java и моей функции. Тем не менее, результаты разные. Это означает, что я либо сделал несколько ошибок, либо неправильно понял концепцию.
import java.util.Random;
public class test2 {
private static long multiplier = 0x5DEECE66DL;
private static long addend = 0xBL;
private static long mask = (1L << 48) - 1;
public static void main(String args[]){
long seed = 128856;
Random random = new Random(seed);
long n1 = random.nextInt();
long n2 = random.nextInt();
long n3 = random.nextInt();
System.out.println("Results: " + n1 +" "+ n2 +" "+ n3);
System.out.println("seed: " + seed);
long seed0 = (seed ^ multiplier) & mask;
System.out.println("seed0: " + seed0);
long seed1 = ((seed0 * multiplier + addend) & mask);
System.out.println("seed1: " + seed1);
long v1 = seed1 >>> 16;
System.out.println("v1: " + v1);
long seed2 = ((seed1 * multiplier + addend) & mask);
System.out.println("seed2: " + seed2);
long v2 = seed2 >>> 16;
System.out.println("v2: " + v2);
}
}
А вот и скриншот с результатом: Результат
n1 не равно v1. Скажите пожалуйста, какие ошибки я допустил? Спасибо.
1 ответ
Решение
Хороший вопрос! Генератор случайных чисел не является генератором случайных сигналов! Единственная разница между вашим поколением и тем, что делает Random, вы возвращаете долго, в то время как Random возвращает его в int.
Следующее изменение исправит это:
public static void main(String args[]){
long multiplier = 0x5DEECE66DL;
long addend = 0xBL;
long mask = (1L << 48) - 1;
long seed = 128856;
Random random = new Random(seed);
long n1 = random.nextInt();
long n2 = random.nextInt();
long n3 = random.nextInt();
System.out.println("Results: " + n1 +" "+ n2 +" "+ n3);
System.out.println("seed: " + seed);
long seed0 = (seed ^ multiplier) & mask;
System.out.println("seed0: " + seed0);
long seed1 = ((seed0 * multiplier + addend) & mask);
System.out.println("seed1: " + seed1);
int v1 = (int)(seed1 >>> 16);
System.out.println("v1: " + v1);
long seed2 = ((seed1 * multiplier + addend) & mask);
System.out.println("seed2: " + seed2);
int v2 = (int)(seed2 >>> 16);
System.out.println("v2: " + v2);
}