[英]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
。 SecureRandom
比Random
更昂貴,但這不太可能對您的用例產生任何影響。
另一方面,如果這些異常值實際上以理論所預測的速率發生,則更改隨機數生成器不會有任何區別。
如果這些異常值確實很麻煩,那么您需要采用其他方法。 無需生成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.