【问题标题】: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 中,而不是每次都访问它。可能就是这么简单。

标签: javascript math random floating-point integer


【解决方案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 将在包含一百万个随机整数的数组中循环。与调用 randomfloor 相比,它是 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")
          }
          

          【讨论】:

            猜你喜欢
            • 2012-03-17
            • 1970-01-01
            • 1970-01-01
            • 2017-01-21
            • 2011-02-12
            • 2010-10-26
            • 1970-01-01
            • 2023-04-01
            • 1970-01-01
            相关资源
            最近更新 更多