【问题标题】:Is there a way in Java to generate random numbers following fixed mean and standard deviation?Java中有没有办法按照固定的平均值和标准偏差生成随机数?
【发布时间】:2020-02-15 15:07:06
【问题描述】:

问题

我知道如何生成具有固定均值和标准差的随机数。

我还希望将这些值限制在一个范围内(我知道这意味着结果将不是真正的高斯分布,而是一个裁剪的高斯分布)

上下文

我试图回答的更广泛的问题是

假设你有一个黑盒子,它每 10 秒放出一只猴子,那么 猴子的身高在 24 到 36 英寸之间。的高度 半小时以上生成的猴子遵循正态分布 平均 30.5 英寸,标准差 2.5。虽然有另一个 房间里的盒子,如果猴子的高度低于它会导致猴子消失 28 英寸,每 20 秒发生一次。编写程序计算 n天后留在房间里的猴子数量(n是用户 输入)。为了逻辑起见,假设空间足够大 容纳无限数量的猴子,它们有食物。

【问题讨论】:

  • Random.nextGaussian() 可能是你想要的。
  • 我假设这是您正在做的练习的一部分。您已经很好地将您遇到的问题从整个练习中分离出来,但是最好更清楚地将您的问题(我认为第二段)与上下文(第一段)分开
  • @VGR Random.nextGaussian() 在 mean = 0 和 std dev = 1 之后生成数字。但我想在 mean = 30.5 和 std dev = 2.5 之后生成数字
  • @RichardTingle 我必须在 24 和 36 的范围内按照 mean = 30.5 和 st dev = 2.5 生成随机数。
  • @vikas 你可以通过添加它来影响平均值,我认为你可以通过乘以 nextGausian() 的结果来影响 SD

标签: java random normal-distribution


【解决方案1】:

作为VGR mentioned 在他们的评论中,您可以使用Random.nextGaussian() 生成一个高斯分布随机数,均值为 0,标准差为 1。您可以通过添加该值来影响均值,并通过以下方式影响标准差倍增。因此,您可以一起使用您的嘲笑属性生成随机数。你会想要

desiredMean + desiredStandardDeviation * Random.nextGaussian()

您已经声明了一个附加要求,即值必须在一个范围内,您可以通过重新滚动一个新值来轻松实现这一点,直到您获得该范围内的一个值。

【讨论】:

    【解决方案2】:

    nextGaussian() 方法返回均值为 0,标准差为 1 的随机数。

    这意味着 nextGaussian() 返回的数字将倾向于在 0 附近“聚集”,并且(大约)70% 的值将介于 -1 和 1 之间。根据 nextGaussian() 返回的值,您可以缩放并移动它们以获得其他正态分布:

    • 要更改分布的平均值(平均值),请添加所需的 价值;

    • 改变标准差,乘数值。

    示例: 生成平均值为 500 且标准差为 100 的值:

    double val = r.nextGaussian() * 100 + 500;
    

    生成平均值为 30.5 且标准差为 2.5 的值:

    double val = r.nextGaussian() * 2.5 + 30.5;
    

    这 70% 的值将在 28 到 33 之间。由于 99.7% 的值在 3-sigma 范围内,猴子的身高在 24 到 36 之间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 2020-12-01
      • 2013-09-25
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多