我需要生成具有以下属性的随机数。

最小应该是200

最大应该是20000

平均值(平均值)为500。

可选:第75个百分点为5000

绝对不是统一的分布,也不是高斯。我需要给一些左偏度。

有帮助吗?

解决方案

Java随机可能无法正常工作,因为它只会给您正常的(高斯)分布。

您可能正在寻找的是F分发(见下文)。您可能可以使用Distlib库 这里 并选择 F分布. 。您可以使用 随机的 获取随机数的方法。

enter image description here

其他提示

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个统一分布的特定情况:

Uniform distributions(忽略左侧的数字,但要扩展!)

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

给定已知平均值(mean), midpt 可以通过:

3 * mean / 2 - (startpt + endpt) / 4
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top