java.util.random是如何工作的?

java.util.random是如何工作的?,java,random,lcg,Java,Random,Lcg,为了理解java.util.random是如何工作的,我编写了一段简单的代码来模拟java随机函数,并比较了java随机函数和我的函数的结果。然而,结果是不同的。这意味着要么我犯了一些错误,要么我误解了这个概念 import java.util.Random; public class test2 { private static long multiplier = 0x5DEECE66DL; private static long addend = 0xBL; private

为了理解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);
  }   

}
import java.util.Random;
公共类test2{
专用静态长乘法器=0x5deec66dl;
专用静态长加数=0xBL;
专用静态长掩码=(1L>>16;
System.out.println(“v1:+v1”);
长种子2=((种子1*乘法器+加数)和掩码);
System.out.println(“seed2:+seed2”);
长v2=seed2>>>16;
System.out.println(“v2:+v2”);
}   
}
下面是结果的屏幕截图:


n1不等于v1。请告诉我我犯了什么错误?谢谢。

好问题!Random Generator毕竟不是一个Random Generator!你这一代和什么Random it之间的唯一区别是返回一个long,而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);
}
publicstaticvoidmain(字符串参数[]){
长乘数=0x5deec66dl;
长加数=0xBL;
长掩模=(1L>>16);
System.out.println(“v1:+v1”);
长种子2=((种子1*乘法器+加数)和掩码);
System.out.println(“seed2:+seed2”);
int v2=(int)(种子2>>>16);
System.out.println(“v2:+v2”);
}

有许多算法可以创建伪随机数。@OldProgrammer我正在尝试理解java.util.random,我相信它是线性同余生成器。这是openjdk版本-@OldProgrammer感谢您提供的链接。虽然我在编写代码之前已经检查了这些算法。代码是基于此编写的。但是,我仍然不明白为什么结果不一样。你能告诉我为什么吗?你的代码计算的值几乎正确。问题是
Random.nextInt()
返回一个扩展为long的int值,但您的代码计算的是long值而不是int。n1和v1的低32位与您相同。我很高兴看到您提供了正确的代码。