日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

java 随机数种子

發布時間:2023/12/15 综合教程 22 生活家
生活随笔 收集整理的這篇文章主要介紹了 java 随机数种子 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

引子:需要實現每天隨機獲得一個禮包,且全服玩家隨出來的都是同一個。

實現方案:以當前時間是一年的第幾天作為random的種子,取1~禮包總個數范圍內的隨機值。

  public static int getBuffId() {
        Calendar c = Calendar.getInstance();
        c.setTimeInMillis(System.nanoTime());
        int dateInYear = c.get(Calendar.DAY_OF_YEAR);
        return new Random(dateInYear).nextInt(10) + 1;
    }

于是決定深入了解一下隨機數的種子。

Random兩種構造方法。一種是無參構造函數。種子是++seedUniquifier + System.nanoTime(), 所以每新new一個Random實例,種子都會變。

private static volatile long seedUniquifier = 8682522807148012L;
public Random() { this(++seedUniquifier + System.nanoTime()); }

另一種是設置種子的構造方法。

 public Random(long seed) {
        this.seed = new AtomicLong(0L);
        setSeed(seed);
    }

看一下next()方法。每次調用next()方法。種子就會發生變化nextseed = (oldseed * multiplier + addend) & mask;

private final static long multiplier = 0x5DEECE66DL;
private final static long addend = 0xBL;
private final static long mask = (1L << 48) - 1;
protected int next(int bits) { long oldseed, nextseed; AtomicLong seed = this.seed; do { oldseed = seed.get(); nextseed = (oldseed * multiplier + addend) & mask; } while (!seed.compareAndSet(oldseed, nextseed));//保證oldseed跟nextseed不相同 return (int)(nextseed >>> (48 - bits)); }
public int nextInt() { return next(32); }

實例:

//實例1
       Random random = new Random(1000);
        for (int i = 1; i < 4; i++) {
            System.out.println(random.nextInt());
        }
   
        System.out.println("...........");

//實例2
        for (int j = 0; j < 4; j++) {
            System.out.println(new Random(1000).nextInt());
        }

運行結果:

1487836800000
-1244746321
1060493871
-1826063944
...........
-1244746321
-1244746321
-1244746321
-1244746321

分析:運行結果不一樣。原因如下:

實例1設定了種子1000,for循環里,nextSeed一直在變,所以隨出來的值也每次不一樣。

實例2每次new一個新的Random對象,每次seed都會被重置成1000,后面調用nextInt() 算出來的nextSeed都是同一個值,所以不管循環幾次,隨出來的結果都一樣。

總結

以上是生活随笔為你收集整理的java 随机数种子的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。