在Java中生成具有max,min和mean(平均值)的随机数
我需要生成具有以下属性的随机数。
最小应该是200
Max应该是20000
平均值(平均值)是500。
可选:第75百分位为5000
绝对不是均匀分布,也不是高斯分布。 我需要给出一些左偏斜。
Java Random可能无法正常工作,因为它只能为您提供正常(高斯)分布。
您可能正在寻找的是f分布(见下文)。 你可以在这里使用distlib库并选择f分布 。 您可以使用随机方法获取随机数。
假设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 – 我正在使用他的“包容性随机”function。
是的,我意识到我的数字是错误的,因为这种方法适用于离散数字,我的计算是连续的。 如果有人可以纠正我的边境案件,那将是件好事。
您可以在[0; 1]上使用函数f,例如
Integral(f(x)dx) on [0;1] = 500 f(0) = 200 f(0.75) = 5000 f(1) = 20000
我想这个forms的function
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