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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 随机数 分布_java – 随机数的分布

發布時間:2025/3/20 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 随机数 分布_java – 随机数的分布 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

My real question is whether option 1 is mathematically valid.

讓我們從選項2開始.java.util.Random使用的隨機數生成器在javadoc中指定如下:

The class uses a 48-bit seed, which is modified using a linear congruential formula. (See Donald Knuth, The Art of Computer Programming, Volume 2, Section 3.2.1.)

并且在各種方法的javadoc中有更具體的細節.

但重點是我們使用的是由線性同余公式生成的序列,這樣的公式具有很大程度的自相關性……這可能會有問題.

現在使用選項1,您每次使用具有新種子的不同Random實例,并應用一輪LC公式.因此,您將獲得一系列可能與種子自相關的數字.但是,種子以不同的方式生成,具體取決于Java版本.

Java 6執行此操作:

public Random() { this(++seedUniquifier + System.nanoTime()); }

private static volatile long seedUniquifier = 8682522807148012L;

……根本不是隨機的.如果以恒定間隔創建Random實例,則種子可能間隔很近,因此您的選項#1生成的隨機數序列可能會自動關聯.

相比之下,Java 7和8這樣做:

public Random() {

this(seedUniquifier() ^ System.nanoTime());

}

private static long seedUniquifier() {

// L'Ecuyer, "Tables of Linear Congruential Generators of

// Different Sizes and Good Lattice Structure", 1999

for (;;) {

long current = seedUniquifier.get();

long next = current * 181783497276652981L;

if (seedUniquifier.compareAndSet(current, next))

return next;

}

}

private static final AtomicLong seedUniquifier

= new AtomicLong(8682522807148012L);

由上述產生的種子序列可能是(真實的)隨機性的更好的近似.這可能使您的選項#1優于選項#2.

Java 6到8中選項#1的缺點是System.nanoTime()可能調用涉及系統調用.那是相對昂貴的.

所以簡短的回答是它是特定于Java版本的選項#1和選項#2從數學角度產生質量更好的“隨機”數字.

在這兩種情況下,數字的分布在足夠大的樣本大小上是均勻的,盡管我不確定當過程是確定性時談論概率分布是有意義的.

然而,這兩種方法都不適合作為“加密強度”隨機數發生器.

總結

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

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