用于生成具有更大/更小概率的随机数的简单算法

时间:2013-09-18 22:48:12

标签: javascript algorithm random

我目前正在开发一款带有可滚动屏幕的游戏,我需要找到一种简单的算法来在游戏中放置障碍物。我有一个gameSpeed,它在时间上增加(从1到12,每1/60增加0.005)和一系列可用位置在200到600(整数)之间。当速度较大时,我希望获得接收较小数字的更大概率,但这是我的第14个小时直接编码,我无法提出任何可用且不过分复杂的东西。我想最小化数学和随机函数,以便渲染循环不会花费太长时间。任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:5)

您可以将随机数平方或平方根以在一个方向上移动密度。 Math.random()*Math.random()生成较小数字(接近0)的概率高于较高数字(接近1)。

您的公式可能就像

var position = Math.pow(Math.random(), gameSpeed / 3) * 400 + 200;

答案 1 :(得分:2)

我能想到的最简单的答案是创建一个数字比较高数字更低的数组,例如,在[1,5](包括两者)之间产生随机数。因此,您的数组可能看起来像[1,1,1,1,1,2,2,2,2,3,3,3,4,4,5]

当你从该阵列中随机挑选一个元素时,与高一个元素相比,你获得较低数字的机会较高。

答案 2 :(得分:1)

另一种方法可能是拥有两个(或更多)百分比:

说,从10%的时间开始我们访问90%的范围,90%的时间我们访问其他10%。然后我们随着速度的增加逐渐翻转这些数字。例如,

var lBound = 200,
    uBound = 600,
    range = uBound - lBound,
    gameSpeed = 1,
    initialMarker = 0.1,
    percentageRange = 1 - 2 * initialMarker,
    marker = (gameSpeed - 1) / 11 * percentageRange + initialMarker,
    position

Math.random() <= marker ? position = Math.floor(Math.random() * (1 - marker) * range) + lBound 
                        : position = uBound - Math.floor(Math.random() * marker * range)

console.log(position)

尝试更改gameSpeed,看看会发生什么。更改initialMarker以获得不同的百分比(目前设置为0.1,即10%/ 90%)。