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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java的随机数原理

發布時間:2023/12/20 java 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java的随机数原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java生成隨機數時,可以會使用以下方法
final int i = new Random().nextInt(int bound);
或者
final double v = Math.random();
初一看,以為是兩種方式,其實第二種的底層也是使用了Random的方法nextDouble(),所以我們主要看Random的方法即可。

原理

計算機生成隨機數,有幾種方式
1.物理方式
正在意義上的隨機數生成器,無法預測且無周期,一般利用計算機的電阻、熱噪聲等得到隨機數,不過物理方式生成隨機數的效率不高,需要計算機高效的計算。
2.隨機數表方式
事先生成好隨機數,放在內存里,需要時從表里獲取,這種需要內存,如果隨機數量非常大,那將需要很大的內存。
3.偽隨機數方式
使用“種子”來生成隨機數序列,使用算法在種子基礎上生成隨機數,由于是算法生成的,偽隨機數生成是可以預測且周期性的,并不算是真正意義上的隨機,所以叫偽隨機數。

同余法

同余公式(congruential formula)是一種常用的偽隨機數算法。在Java中,線性同余算法就是同余算法的一種變種。Random類中,使用了48(bit)位作為種子,在線性同余算法中生成隨機數。
使得結果小于某個數,一般使用取余的計算,結果都是同一除數的余數,所以叫做同余法。
nextInt(int bound)方法會返回一個偽隨機的,均勻分布于0(包含)到bound(不包含)之間的int值。

public int nextInt(int bound) {if (bound <= 0)throw new IllegalArgumentException(BadBound);int r = next(31);int m = bound - 1;if ((bound & m) == 0) // i.e., bound is a power of 2r = (int)((bound * (long)r) >> 31);else {for (int u = r;u - (r = u % bound) + m < 0;u = next(31));}return r;}

其中next(int bit)方法源碼

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));return (int)(nextseed >>> (48 - bits));}

線性同余公式就是這一行代碼,
nextseed = (oldseed * multiplier + addend) & mask;
這個和以下線性公式非常相似
Xn+1=(a*Xn+c)(mod m)
Xn剛開始時就是初始化時的“種子”,經過運算會得到新的“種子”nextseed作為下一次運算的“種子”oldseed。
或許,你覺得疑惑求余,沒看到有取余的計算,可以看看multiplier,addend,mask變量

private static final long multiplier = 0x5DEECE66DL;private static final long addend = 0xBL;private static final long mask = (1L << 48) - 1;

和mask(即是 (1L << 48) - 1)作與運算,就是取余的運算。

總結

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

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