簡體   English   中英

Java 中是否有辦法按照固定均值和標准差生成隨機數?

[英]Is there a way in Java to generate random numbers following fixed mean and standard deviation?

問題

我知道如何生成具有固定均值和標准偏差的隨機數。

我還希望將這些值限制在一個范圍內(我知道這意味着結果將不是真正的高斯分布,而是一個剪裁的高斯分布)

語境

我試圖回答的更廣泛的問題是

假設你有一個黑盒子,每 10 秒發出一只猴子,猴子的高度在 24 到 36 英寸之間。 半小時內產生的猴子身高服從正態分布,平均為 30.5 英寸,標准差為 2.5。 雖然房間里有另一個盒子,如果猴子的高度低於 28 英寸,它會導致它消失,這種情況每 20 秒發生一次。 編寫一個程序,計算 n 天后房間里剩下的猴子數量(n 是用戶輸入)。 為了邏輯起見,假設房間足夠大,可以容納無限數量的猴子並且它們有食物。

nextGaussian() 方法返回均值為 0、標准差為 1 的隨機數。

這意味着 nextGaussian() 返回的數字將傾向於在 0 附近“聚集”,並且(大約)70% 的值將介於 -1 和 1 之間。根據 nextGaussian() 返回的值,您可以縮放和移動他們得到其他正態分布:

  • 要更改分布的 maen(平均值),請添加所需的值;

  • 要更改標准偏差,請乘以該值。

示例:生成平均值為 500 且標准差為 100 的值:

double val = r.nextGaussian() * 100 + 500;

生成平均值為 30.5 且標准差為 2.5 的值:

double val = r.nextGaussian() * 2.5 + 30.5;

這 70% 的值將在 28 到 33 之間。由於 99.7% 的值位於 3-sigma 范圍內,猴子的身高在 24 到 36 之間。

正如VGR 在他們的評論中提到的,您可以使用Random.nextGaussian()生成一個高斯分布的隨機數,平均值為零,標准偏差為 1。您可以通過添加該值來影響平均值,並通過相乘來影響標准偏差。 因此,您可以一起使用您的嘲笑屬性生成隨機數。 你會想要

desiredMean + desiredStandardDeviation * Random.nextGaussian()

您已經聲明了一個附加要求,即值必須在一個范圍內,您可以通過重新滾動一個新值來輕松實現這一點,直到您在該范圍內獲得一個。

從 JDK 17 開始,Random 和 SecureRandom 實現了接口 RandomGenerator,它有一個新方法nextGaussian(double mean, double stddev)

OpenJDK 實現與之前的答案相同:

        default double nextGaussian(double mean, double stddev) {
           if (stddev < 0.0) throw new IllegalArgumentException("standard deviation must be non-negative");

           return mean + stddev * RandomSupport.computeNextGaussian(this);
    }

暫無
暫無

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

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