生成具有非均匀分布的随机数 [英] Generate random number with a non-uniform distribution
问题描述
Javascript的Math.random()
返回具有均匀"分布的伪随机数.
Javascript's Math.random()
returns a psuedo-random number with "uniform" distribution.
我需要生成一个偏向任一侧的[0,1]范围内的随机数. (意味着,更有可能在0或1附近获得更多数字)
I need to generate a random number in the range [0,1] that is skewed to either side. (Meaning, higher chance of getting more numbers next to 0 or next to 1)
理想情况下,我希望有一个参数来设置此曲线.
Ideally I would like to have a parameter to set this curve.
我想我可以做Math.random^2
来得到这样的结果,但是有什么更复杂的方法可以实现这一目标?
I supposed I can do Math.random^2
to get such a result, but what more sophisticated ways are there to achieve this?
推荐答案
我认为您想要 alpha=beta=0.5
I think you want beta distribution with alpha=beta=0.5
可以使用逆累积分布将统一随机数转换为beta分布.
It is possible to transform uniform random number to beta distribution using inverse cumulative distribution.
unif = Math.random()
我不熟悉javascript
,但这应该很清楚:
I am not familiar with javascript
, but this should be clear:
beta = sin(unif*pi/2)^2
PS:您可以生成许多这样的数字并绘制直方图
PS: you can generate many such numbers and plot histogram
要向0倾斜,请将beta
值转换为-
For skewing towards 0, transform the beta
values as -
beta_left = (beta < 0.5) ? 2*beta : 2*(1-beta);
要向1倾斜,请转换为-
For skewing towards 1, transform as -
beta_right = (beta > 0.5) ? 2*beta-1 : 2*(1-beta)-1;
这篇关于生成具有非均匀分布的随机数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!