目前我需要一个提供加权随机数的函数。 它应该选择两个双精度/整数之间的随机数(例如4和8),而中间(6)的值将平均发生,大约是限制器值4和8的两倍。 如果这只是关于整数,我可以使用变量和自定义概率预定义值,但我需要函数给出一个至少2位数的双精度数(意味着数千个不同的数字)!
我使用的环境是" Game Maker"它提供了各种基本的随机生成器,但没有加权的。
任何人都可能带领我朝着正确的方向如何实现这一目标吗?
提前致谢!
答案 0 :(得分:3)
两个独立的连续均匀(0,1)的总和,U1
和U2
,在0和2之间具有连续的对称三角形分布。该分布的峰值为1并且逐渐变细两端都为零。我们可以轻松地将其转换为(4,8)范围,通过2缩放并添加4,即4 + 2*(U1 + U2)
。
但是,您不希望端点处的高度为零,您希望峰值高度的一半。换句话说,你想要一个坐在矩形底座上的三角形(即均匀),在端点处高度为h
,在中间高度为2h
。这使得生活变得简单,因为三角形必须在矩形基部上方具有高度h
的峰值,而高度为h
的三角形具有相同基部和高度的{1}的矩形区域的一半}}。因此,2/3的概率在基数中,1/3在三角形中。
组合上述元素会产生以下伪代码算法。如果h
是一个返回连续统一(0,1)随机数的函数调用:
rnd()
我使用它绘制了一百万个值并绘制了直方图:
答案 1 :(得分:2)
对于有人在Game Maker(或其他语言)中需要这个作为通用功能的情况:
if random(1) <= argument0
return argument1 + ((argument2-argument1) * random(1))
else
return argument1 + (((argument2-argument1)/2) * (random(1) + random(1)))
调用如下(类似于标准的random_range函数):
val = weight_random_range(FACTOR, FROM, TO)
“因子”确定整个概率数是多少是恒定概率的“基数”。例如。 2/3表示上图。 0将提供一个完美的三角形和一个矩形(没有加权)。