在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)返回带有参数XY的beta分布中的随机数。

给定已知均值( mean ), midpt可以通过以下公式计算:

 3 * mean / 2 - (startpt + endpt) / 4 
Interesting Posts