Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 生成概率较大/较小随机数的简单算法_Javascript_Algorithm_Random - Fatal编程技术网

Javascript 生成概率较大/较小随机数的简单算法

Javascript 生成概率较大/较小随机数的简单算法,javascript,algorithm,random,Javascript,Algorithm,Random,我目前正在开发一款可滚动屏幕的游戏,我需要找到一个简单的算法来设置游戏中的障碍物。我有一个gameSpeed,它在时间上增加(从1增加到12,每1/60秒增加0.005),并且可用位置范围在200到600(整数)之间。我想在速度更大的时候获得更大的概率来接收更小的数字,但这是我连续14个小时的编码,我不能想出任何有用的、不过于复杂的方法。我希望最小化数学和随机函数,这样渲染循环不会花费太长时间。感谢您的帮助 您可以对随机数进行平方或平方根运算,以将密度向一个方向移动Math.random()*M

我目前正在开发一款可滚动屏幕的游戏,我需要找到一个简单的算法来设置游戏中的障碍物。我有一个
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,2,2,2,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)
var lBound=200,
uBound=600,
范围=uBound-lBound,
游戏速度=1,
initialMarker=0.1,
percentageRange=1-2*初始标记,
标记=(游戏速度-1)/11*百分比范围+初始标记,
位置

Math.random()生成随机数并做一些数学运算几乎不会减慢游戏速度。我认为你可以使用随机数的n次方,但你必须校准因子,它有点慢:
Math.pow(Math.random()*something,-gameSpeed)+200
,我认为'something=Math.pow(400,gameSpeed)你也可以使用其他曲线,例如对数曲线,但它仍然没有它应有的速度快…对于
var position=Math.pow(Math.random(),gameSpeed/2-3)*400+200当gameSpeed=6时,位置总是等于600。速度为'12'时效果很好,但对于1,我得到的数字高达16470oops,你是对的。指数永远不会变为负或零。对于
<1
它将生成更大的数字,对于
1
它将生成均匀分布,对于
<1
它将生成更多更小的数字。