在javascript中生成随机整数的最快方法是啥?
Posted
技术标签:
【中文标题】在javascript中生成随机整数的最快方法是啥?【英文标题】:What is the fastest way to generate a random integer in javascript?在javascript中生成随机整数的最快方法是什么? 【发布时间】:2012-02-05 06:03:34 【问题描述】:通常这是在 javascript 中获取随机数的方式。
Math.random();
但是,这种方法在生成随机整数时似乎效率低下。
首先,随机函数必须生成一个随机小数,例如0.1036098338663578
,然后它必须乘以一个合适的范围(10.464593220502138
)。最后, floor 函数减去小数以产生结果(在本例中为 10
)。
var random_integer = Math.floor(Math.random()*101);
有没有更快的方法在 javascript 中生成随机整数?
编辑1:
我正在使用它来创建画布 html5 游戏。 FPS 大约为 50,我的代码除了生成随机数外,还进行了相当优化。
【问题讨论】:
“但是这种方法似乎效率低” - 你测量了吗? 您需要多快?使用上面的代码,我可以在我的旧笔记本电脑上在 500 毫秒内获得 1000 万个随机数。 在大多数语言中,您都需要一个随机数生成器,通过对一些素数进行播种和修改。然而,在 JavaScript 中,评估语言的开销比调用 Math.random() 之类的开销要多,这意味着原生调用几乎总是比您可以实现的任何东西都快。 尝试将画布宽度保存在 var 中,而不是每次都访问它。可能就是这么简单。 【参考方案1】:不,没有更简单或更短的方法。不过,如果需要多次执行,您可以创建一个函数。
【讨论】:
【参考方案2】:你的方法是在 javascript 中检索随机整数的正确方法,不用担心它会运行得很快。
【讨论】:
【参考方案3】:这段代码更快……打字。
var random_integer = Math.random()*101|0;
但它不适用于大量数字。
(而且它并没有运行得更快,至少在 chrome 中没有。)
不过,如果你事先生成随机数,你可以在游戏过程中获得更快的速度。
for (var i=1e6, lookupTable=[]; i--;)
lookupTable.push(Math.random()*101|0);
function lookup()
return ++i >= lookupTable.length ? lookupTable[i=0] : lookupTable[i];
lookup
将在包含一百万个随机整数的数组中循环。与调用 random
和 floor
相比,它是 much faster(当然,生成查找表会预先考虑“加载时间”)。
【讨论】:
它在除了 chrome 之外的几乎所有东西上都运行得更快 嗯,很有趣。我通常这样做是因为我很懒,而且更容易阅读。 @cwolves 我刚刚在 Firefox 中运行它,结果相同...jsperf.com/floor-or-or @Rasu 不要预先分配数组。对于非常大的数组,您可以将速度提高 1000 倍 :) @DaggNabbit 在节点 js 中花了 50 多秒,然后我不得不停止它!因为节点必须在运行时为百万个项目更改数组元素的默认类型。但是在没有预分配的情况下生成 100 万个项目大约需要 100 毫秒!因为它通过第一个值的类型预先分配自己。您可以通过在 javascript 中预分配 Typed arrays 来获得更高的性能。【参考方案4】:如果您想避免浮点计算,那么您可以通过编写自己的伪随机数生成器来实现。 Here 是众所周知的伪随机数生成器 (PRNG) 的列表。 Linear congruential generator 是最容易实现的,在性能方面也可能是最有效的。但是,您需要充分了解theory behind PRNGs 才能编写有效的。不过,这可能不值得付出努力。 JS 实现应该足够有效。最后,您很有可能会发现Math.random()
的运行速度比您的代码快。
【讨论】:
【参考方案5】:const getRandomInt = (base = 10) =>
return Math.floor(Math.random() * base)
【讨论】:
这是比之前的答案更适合 2017 年的方法 这是一个比以前的答案更“让我们忽略 Dagg Nabbit 已经发布了几乎完全相同的答案”的方法。尽管您的代码“有效”,但它几乎与 Dagg Nabbit 的答案重复。在这种情况下,我建议对他的答案进行建议编辑,而不是将其作为您自己的答案发布。【参考方案6】:我主要使用
var a = Math.floor(Math.random((number you'd like to be minimum, (number you'd like to be maximum) * (number you'd like to be maximum);
【讨论】:
你听说过在 sn-ps 中使用 cmets 吗?Math.random() * (max - min) + min
?【参考方案7】:
这是最短的单行随机数生成器代码
rnd=(a,b)=>~~(Math.random()*(b-a))+a
如何使用:rnd(min,max) 示例:rnd(10,100)
【讨论】:
【参考方案8】:这是我使用的:
function getRandomInt(max)
return Math.floor(Math.random() * max);
如何使用它的一个例子是
function getRandomInt(max)
return Math.floor(Math.random() * max);
if(getRandomInt(420) == 69)
console.log("nice")
【讨论】:
以上是关于在javascript中生成随机整数的最快方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章