Java中有没有一种方法可以按照固定的均值和标准差生成随机数?

时间:2019-10-18 15:26:27

标签: java random normal-distribution

问题

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

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

上下文

我要回答的更广泛的问题是

  

假设您有一个黑匣子,每10秒发出一只猴子,   猴子的高度在24到36英寸之间。的高度   半小时以上产生的猴子遵循正态分布   平均30.5英寸,标准差2.5。虽然有另一个   房间中的盒子,如果猴子的高度低于此高度,猴子就会消失   28英寸,每20秒发生一次。编写程序进行计算   n天后留在房间中的猴子的数量(n是用户   输入)。出于逻辑考虑,假设房间足够大   容纳了无数的猴子,他们有食物。

2 个答案:

答案 0 :(得分:0)

正如VGR mentioned在其评论中一样,您可以使用Random.nextGaussian()生成高斯分布的随机数,其均值为零,标准偏差为1。您可以通过将该值加和来影响均值并影响乘以标准偏差。因此,您可以一起使用自己喜欢的属性生成随机数。你想要

desiredMean + desiredStandardDeviation * Random.nextGaussian()

您还提出了另外一个要求,即值必须在一个范围内,只需重新滚动一个新值,直到获得该范围内的值,就可以轻松实现。

答案 1 :(得分:0)

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之间。