簡體   English   中英

java.util.random如何工作?

[英]how does java.util.random work?

為了理解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。 請告訴我我犯了什么錯誤? 謝謝。

好問題! 畢竟,隨機生成器不是隨機生成器! 您的世代與您返回的是Random的唯一區別是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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM