繁体   English   中英

Java 中是否有办法按照固定均值和标准差生成随机数?

[英]Is there a way in Java to generate random numbers following fixed mean and standard deviation?

问题

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

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

语境

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

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

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

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

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

  • 要更改标准偏差,请乘以该值。

示例:生成平均值为 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 之间。

正如VGR 在他们的评论中提到的,您可以使用Random.nextGaussian()生成一个高斯分布的随机数,平均值为零,标准偏差为 1。您可以通过添加该值来影响平均值,并通过相乘来影响标准偏差。 因此,您可以一起使用您的嘲笑属性生成随机数。 你会想要

desiredMean + desiredStandardDeviation * Random.nextGaussian()

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

从 JDK 17 开始,Random 和 SecureRandom 实现了接口 RandomGenerator,它有一个新方法nextGaussian(double mean, double stddev)

OpenJDK 实现与之前的答案相同:

        default double nextGaussian(double mean, double stddev) {
           if (stddev < 0.0) throw new IllegalArgumentException("standard deviation must be non-negative");

           return mean + stddev * RandomSupport.computeNextGaussian(this);
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM