在JavaScript中生成随机整数的最快方法是什么?

18

通常这是在 JavaScript 中获取随机数的方法。

Math.random();

然而,当涉及到生成随机整数时,这种方法似乎效率不高。

首先,随机函数必须生成一个随机小数,例如0.1036098338663578,然后它必须乘以适当的范围(10.464593220502138)。最后,floor函数减去小数以产生结果(在本例中为10)。

var random_integer = Math.floor(Math.random()*101);

在JavaScript中生成随机整数有更快的方法吗?

Edit1:

我正在使用它来创建一个canvas HTML5游戏。 FPS约为50,除了生成随机数之外,我的代码已经相当优化。


6
"然而,这种方法似乎效率不高" - 你有进行过测量吗? - Mitch Wheat
7
你需要多快?使用上面的代码,在我的旧笔记本电脑上可以在500毫秒内获取1000万个随机数。 - earldouglas
1
在大多数编程语言中,你需要通过种子和模运算来生成随机数。然而,在JavaScript中,语言的评估开销比调用类似Math.random()的函数的开销更大,这意味着本地调用几乎总是比你可以实现的任何东西都要快。 - user578895
尝试将画布宽度保存在变量中,而不是每次访问它。也许就这么简单。 - King Friday
8个回答

30

这段代码输入更快,但不一定执行更快。

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会在一个包含一百万个随机整数的数组中进行循环。与调用randomfloor相比,它要快得多(当然,从生成查找表开始就有“加载时间”惩罚)。


1
它在几乎所有方面都运行得更快,但在 Chrome 中除外。 - user578895
1
@cwolves 我刚在火狐浏览器上运行了它,结果相同... http://jsperf.com/floor-or-or - Dagg Nabbit
2
@Rasu 不要预先分配数组。对于非常大的数组,你可以实现1000倍的速度提升 :) - Ghominejad
3
在 Node.js 中,当我处理一百万个数组元素时,由于 Node.js 必须在运行时更改数组元素的默认类型,所以它花费了超过 50 秒的时间。但是,如果在没有预分配的情况下生成一百万个数组元素,则只需要约 100 毫秒!这是因为它通过第一个值的类型自动进行了预分配。您可以通过在 JavaScript 中预分配Typed arrays 来获得更高的性能。 - Ghominejad
@user2864740 我同意一般情况下这是不必要的,但OP声称在这种情况下RNG是瓶颈,并且预先生成随机数似乎在大多数浏览器的大多数版本中都能显著帮助。我假设使用种子PRNG(大多数游戏可能会这样做)比Math.random慢得多,但查找时间当然是相同的。你知道更好的解决方法吗? - Dagg Nabbit
显示剩余6条评论

4
如果你想避免浮点数计算,那么你可以编写自己的伪随机数生成器来实现。这里是一个知名的伪随机数生成器(PRNG)列表。线性同余生成器是最容易实现和在性能方面最有效的生成器。然而,你需要足够了解PRNG背后的原理才能编写出有效的生成器。但这可能并不值得努力。JS实现应该已经足够有效了。最终,很可能你会发现Math.random()比你的代码运行得更快。

2

这是我使用的:

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")
}

1
我主要使用


    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);

4
你听说过在代码片段中使用注释吗? - user9016207
6
Math.random() * (max - min) + min - bryc

0

不,没有更简单或更短的方法。但是如果您需要多次执行此操作,可以创建一个函数。


0
const getRandomInt = (base = 10) => {
  return Math.floor(Math.random() * base)
}

这是一种比之前的答案更适合2017年的方法。 - Marc Lundgren
这是一种更加“忽略Dagg Nabbit已经发布了几乎完全相同的答案”的方法,而不是之前的答案。虽然你的代码“可行”,但它几乎是Dagg Nabbit答案的复制。在这种情况下,我建议您对他的答案进行编辑,而不是将其作为自己的答案发布。 - Jack G

-1

这是最短的一行随机数生成器代码

rnd=(a,b)=>~~(Math.random()*(b-a))+a

使用方法:rnd(min,max) 示例:rnd(10,100)


-1

你的方法是在JavaScript中检索随机整数的正确方法,不用担心性能问题,它会运行得很快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接