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

Simple algorithm for generating random numbers with bigger/smaller probability

本文关键字:概率 随机数 算法 简单 用于      更新时间:2023-09-26

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

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

您的公式可能如下所示

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

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

当您从该数组中随机选择一个元素时,与高数字相比,您将有更高的机会拾取低数字。

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

比如说,从 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%)。