加权随机数(没有预定义值!)

时间:2015-04-28 09:46:01

标签: random game-maker

目前我需要一个提供加权随机数的函数。 它应该选择两个双精度/整数之间的随机数(例如4和8),而中间(6)的值将平均发生,大约是限制器值4和8的两倍。 如果这只是关于整数,我可以使用变量和自定义概率预定义值,但我需要函数给出一个至少2位数的双精度数(意味着数千个不同的数字)!

我使用的环境是" Game Maker"它提供了各种基本的随机生成器,但没有加权的。

任何人都可能带领我朝着正确的方向如何实现这一目标吗?

提前致谢!

2 个答案:

答案 0 :(得分:3)

两个独立的连续均匀(0,1)的总和,U1U2,在0和2之间具有连续的对称三角形分布。该分布的峰值为1并且逐渐变细两端都为零。我们可以轻松地将其转换为(4,8)范围,通过2缩放并添加4,即4 + 2*(U1 + U2)

但是,您不希望端点处的高度为零,您希望峰值高度的一半。换句话说,你想要一个坐在矩形底座上的三角形(即均匀),在端点处高度为h,在中间高度为2h。这使得生活变得简单,因为三角形必须在矩形基部上方具有高度h的峰值,而高度为h的三角形具有相同基部和高度的{1}的矩形区域的一半}}。因此,2/3的概率在基数中,1/3在三角形中。

组合上述元素会产生以下伪代码算法。如果h是一个返回连续统一(0,1)随机数的函数调用:

rnd()

我使用它绘制了一百万个值并绘制了直方图:

House-shaped distribution

答案 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将提供一个完美的三角形和一个矩形(没有加权)。