在Java中生成具有最大,最小和平均值(平均)的随机数
题
我需要生成具有以下属性的随机数。
最小应该是200
最大应该是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)
从Beta分布中返回带有参数的随机数X
和Y
.
给定已知平均值(mean
), midpt
可以通过:
3 * mean / 2 - (startpt + endpt) / 4