【问题标题】:Why would I combine Math.floor with Math.random?为什么我要将 Math.floor 与 Math.random 结合起来?
【发布时间】:2011-12-21 14:46:30
【问题描述】:

为什么有人会在Math.random 结果上调用Math.floor?我见过它像这样使用:

Math.floor(Math.random() * num);

谁能解释一下?

【问题讨论】:

  • @quixoto 因为我多次看到这段代码,所以我说“我们”,我还是改吧>
  • 我没有批评你的措辞。对于这类问题,实际说明它是您经常看到的内容,或者在某类代码中经常看到的内容很有用,这样人们就可以了解上下文并知道如何最好地回答您。

标签: javascript math random floor


【解决方案1】:

Math.random 返回一个介于 0 和 1 之间的浮点数

返回 [0, 1) 范围内的浮点伪随机数,即从 0(包括)到但不包括 1(不包括),然后您可以将其缩放到所需的范围。

将此乘以 n 得到一个介于 0(包括)和 n(不包括)之间的浮点数。

然后使用

Math.floor 将此浮点数转换为介于 0 和 n - 1(含)之间的 整数

【讨论】:

  • Math.random() 真的包含0 吗?我在 while 循环中运行了 1m 次迭代,但它没有生成 0 一次:/ 我问的原因是因为像 Math.ceil(Math.random() * 10) 这样的某些计算会比 Math.floor(Math.random() * 10 + 1) 更简洁
【解决方案2】:

为什么有人会在 Math.random 结果上调用 Math.floor?

简而言之,当您想将十进制值截断为最接近的整数时(只需删除小数部分)调用Math.floor()。因此,3.9 变为 3,2.1 变为 2,等等......所以,你会通常在您需要整数并且想要小于或等于十进制值的整数时使用它。数学库也有Math.ceil()Math.round()Math.ceil() 为您提供下一个更大的整数,Math.round()根据哪个更接近,向上或向下舍入到最接近的整数。

我见过它像这样使用:Math.floor(Math.random() * num);

Math.floor(Math.Random() * num) 分解为各个部分并解释每个部分,您会得到:

Math.random() 给你一个介于 0 和 1 之间的随机十进制数,包括 0,但不包括 1。所以,它可能会给你类似 0.38548569372 的东西。

Math.random() * num 给你一个介于 0 和 num 之间的随机十进制数,包括 0,但不包括 num。所以,如果 num 是 10,它可能会给你3.8548569372

Math.floor(Math.random() * num)) 给你一个介于 0 和 num 之间的随机整数,包括 0,但不包括 num。所以,它可能会给你3

Math.floor() 将十进制数截断为仅整数部分。随机整数通常用于从数组中获取随机值(需要是整数)。

【讨论】:

  • 抱歉打劫,但要澄清一下……地板是向下圆的,而天花板是向上的吗?
  • @Myles - Math.floor() 为您提供下一个较小的整数。 Math.ceil() 为您提供下一个更高的整数。 Math.round() 检查该值并根据它更接近哪个整数为您提供下一个较低或下一个较高的整数。将来,MDN site 是所有这些类型问题的绝佳参考。
【解决方案3】:

Math.random() 会给你一个长的、随机的小数。通常做的是将该小数乘以 10、100、1000 等以获得随机整数。但是,由于这样的小数很长,要获得绝对整数,您可以使用Math.floor() 将该数字向下舍入。

【讨论】:

    【解决方案4】:

    为什么要将Math.floorMath.random 结合使用?

    你将它们组合起来,否则它会返回一个浮点数。使用 Math.floor 确保它是指定范围内的整数。

    Math.random 返回一个介于 0 和 1 之间的单位。将其乘以您的 num 或最大范围会得到一个最大值为该数字 (1 * num) 的值。同样,Math.floor 只是将其强制为整数。


    幕后花絮:

    随机数 -> .35 -> 乘以 11 的最大值 (num) -> 得到 3.85 -> Math.floor(3.85) -> 3。


    记住numMAX + 1。将num 设置为 5 只会生成数字 1-4!


    您可以查看此链接了解更多信息:http://www.javascriptkit.com/javatutors/randomnum.shtml

    多田:)

    【讨论】:

      【解决方案5】:

      Math.random() 在 [0,1) 之间返回类似于 0.8747230430599302 的内容

      我们使用.floor 将其向下舍入到最接近的整数。例如:

      Math.random()*5 == 2.5889716914389282 这会生成一个介于 [0,5) 之间的数字。

      Math.floor(Math.random()*5) == 2 //in this scenario 生成 [0,4] 之间的数字

      【讨论】:

      • Math.random() 真的包含0 吗?我在 while 循环中运行了 1m 次迭代,但它没有生成 0 一次:/ 我问的原因是因为像 Math.ceil(Math.random() * 10) 这样的某些计算会比 Math.floor(Math.random() * 10 + 1) 更简洁
      【解决方案6】:
      var num = Math.floor(Math.random() * 1000); // e.g. 885
      
      var flNum = Math.random() * 1000; //e.g. 885.9936205333221
      

      试试 Math.random() * 1000 例如,你可能会得到这样的结果:885.9936205333221,在很多情况下我们需要一个四舍五入的数字,所以很多开发人员使用它与 Math.floor 或 Math.ceil 来获得一个整数,如885,如果在你的情况下,你不介意有一个浮点数,就让它保持原样......

      有关 Math.floor 工作原理的更多信息,请查看此链接:

      https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Math/floor

      【讨论】:

        【解决方案7】:

        用于获取 0 到 (max - 1) 之间的整数随机数。

        另一方面,使用| 0 会更快

        const randomInt = Math.random() * num | 0;
        

        | 0 是 0 的二进制,JavaScript 规范实际上说结果在| 发生之前转换为整数。请注意,| 0Math.floor 不同。 | 0 舍入为 0,而 Math.floor 舍入。

                 | 0   Math.floor         
        ------+------+------------
          2.5 |   2  |   2
          1.5 |   1  |   1
          0.5 |   0  |   0
         -0.5 |   0  |  -1
         -1.5 |  -1  |  -2
         -2.5 |  -2  |  -3
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-29
          • 2014-05-07
          • 1970-01-01
          • 2012-09-16
          • 2010-11-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多