簡體   English   中英

什么是Java隨機的標准偏差邊界?

[英]What would be considered a standard deviation boundry for java random?

我正在使用Java 6 random(java.util.Random,linux 64)在服務頁面的一個版本與第二個頁面之間進行隨機決定(正常A / B測試),從技術上講,我使用默認的空構造函數初始化了該類一次並將其作為屬性注入到bean(Spring)中。 大多數情況下,頁面的副本彼此之間的距離在8%(+-)之內,但有時我會看到高達20%的偏差,例如:

我現在有兩個副本可以拆分:680/570被認為是正常的嗎? 有沒有比Java random更好/更快的版本?

謝謝

20%的偏差確實看起來相當大,但是您需要與受過訓練的統計學家進行交談,以了解其是否在統計上異常。

更新 -答案是它不一定是異常的。 統計數據預測,大約0.3%的時間您會得到這樣的異常值。


這樣的結果肯定是由隨機數生成器引起的。 Random類使用簡單的“線性同余”算法,並且此類算法具有很強的自相關性。 根據您使用隨機數的方式,這可能會導致應用程序級別出現異常。

如果這是造成問題的原因,則可以嘗試使用加密強度隨機數生成器替換它。 請參閱javadocs中的SecureRandom SecureRandomRandom更昂貴,但這不太可能對您的用例產生任何影響。


另一方面,如果這些異常值實際上以理論所預測的速率發生,則更改隨機數生成器不會有任何區別。

如果這些異常值確實很麻煩,那么您需要采用其他方法。 無需生成N個隨機選擇,而是生成具有正確所需比率的false / true列表,然后對列表進行混洗; 例如,使用Collections.shuffle

我認為這很正常,因為它意在生成隨機序列。 如果要在一定間隔后重復模式,我想您可能想在構造函數中使用特定的seed值,並在一定間隔后使用相同的種子重置隨機數。

例如,每Random.next.. / n調用Random.next.. ,請使用Random.setSeed(long seed)方法將種子重置為舊值。

java.util.Random.nextBoolean()是一種用於標准二項式分布的方法,其標准差為sqrt(n * p *(1-p)),p = 0.5。

因此,如果執行900次迭代,則標准偏差為sqrt(900 * .5 * .5)= 15,因此大多數情況下,分布將​​在435-465范圍內。

但是,它是偽隨機的,並且在重新開始之前將經歷有限的數字周期。 因此,如果您有足夠的迭代次數,則實際偏差將比理論偏差小得多。 Java使用公式種子=(種子* 0x5DEECE66DL + 0xBL)&((1L << 48)-1)。 您可以編寫一個具有較小數字的不同公式,以有目的地獲得較小的偏差,這將使它成為較差的隨機數生成器,但更適合您的目的。

例如,您可以在其中創建5個對和5個虛假的列表,然后使用Collections.shuffle將列表隨機化。 然后您依次遍歷它們。 經過10次迭代后,您可以重新排序列表,並從頭開始。 這樣一來,您的偏差永遠不會超過5。

有關數學,請參見http://en.wikipedia.org/wiki/Linear_congruential_generator

暫無
暫無

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

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