[英]Given a min, max, mean and standard deviation, generate a random value from a distribution using Java
[英]Generate a random number with max, min and mean(average) in Java
我需要生成具有以下屬性的隨機數。
最小應該是200
Max應該是20000
平均值(平均值)為500。
可選:第75百分位為5000
絕對不是均勻分布,也不是高斯分布。 我需要給出一些左偏斜。
假設X
是你的目標變量,讓我們通過做Y=(X-200)/(20000-200)
規范化范圍。 所以現在你想要一個Y
隨機變量,它取[0,1]
值,平均值(500-200)/(20000-200)=1/66
。
你有很多選擇,最自然的一個在我看來是Beta分布 , Y ~ Beta(a,b)
和a/(a+b) = 1/66
- 你有一個額外的自由度,你可以選擇符合最后的四分位數要求。
之后,您只需將X返回為Y*(20000-200)+200
要生成Beta隨機變量,您可以使用Apache Commons或在此處查看 。
這可能不是您正在尋找的答案,但具有3個統一分布的特定情況:
(忽略左邊的數字,但是要縮放!)
public int generate() {
if(random(0, 65) == 0) {
// 50-100 percentile
if(random(1, 13) > 3) {
// 50-75 percentile
return random(500, 5000);
} else {
// 75-100 percentile
return random(5000, 20000);
}
} else {
// 0-50 percentile
return random(200, 500);
}
}
我怎么得到這些數字
首先,曲線下面積在200-500和500-20000之間。 這意味着高度關系為300 * leftHeight == 19500 * rightHeight
使leftHeight == 65 * rightHeight
這給了我們1/66的機會選擇正確,並有65/66的機會選擇左。
然后我對第75百分位進行了相同的計算,除了比率是500-5000 chance == 5000-20000 chance * 10 / 3
。 同樣,這意味着我們有10/13的機會在50-75百分位數,並且有3/13的機會在75-100。
感謝@Stas - 我正在使用他的“包容性隨機”功能。
是的,我意識到我的數字是錯誤的,因為這種方法適用於離散數字,我的計算是連續的。 如果有人可以糾正我的邊境案件,那將是件好事。
您可以在[0; 1]上使用函數f,例如
Integral(f(x)dx) on [0;1] = 500
f(0) = 200
f(0.75) = 5000
f(1) = 20000
我想這個形式的功能
f(x) = a*exp(x) + b*x + c
可能是一個解決方案,你只需要解決相關的系統。
那么,你做f(uniform_random(0,1))
就在那里!
PERT分布 (或beta-PERT分布 )旨在采用最小和最大估計模式。 它是三角形分布的“平滑”版本,從該分布生成隨機數可以如下實現:
startpt + (endpt - startpt) *
BetaDist(1.0 + (midpt - startpt) * shape / (endpt - startpt),
1.0 + (endpt - midpt) * shape / (endpt - startpt))
哪里-
startpt
是最小的, midpt
是模式(不一定是平均值或平均值), endpt
是最大值, shape
是0或更大,但通常是4,和 BetaDist(X, Y)
返回帶有參數X
和Y
的beta分布中的隨機數。 給定已知均值( mean
), midpt
可以通過以下公式計算:
3 * mean / 2 - (startpt + endpt) / 4
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.