【问题标题】:Why is Math.floor() preferred over Math.round()? [JavaScript]为什么 Math.floor() 优于 Math.round()? [JavaScript]
【发布时间】:2019-07-24 13:28:56
【问题描述】:

我在 FreeCodeCamp 中发现要解决在一个范围内获取随机整数的问题是使用Math.floor。四舍五入是不准确的。它返回等于或小于。不是我想的那样。

这是给定的公式: Math.floor(Math.random() * (max - min + 1)) + min

有谁知道为什么它更用于四舍五入到最接近的整数?

提前致谢!

【问题讨论】:

标签: javascript math range rounding


【解决方案1】:

总结:因为Math.round() 中的值在minmax 中的代表性不足。


我们举个例子,对比一下分别使用Math.floor()Math.random()时的结果。

为了清楚起见,我添加了我们要比较的两个公式:

min = 0;
max = 3;

result = Math.round(Math.random() * (max - min)) + min;
result = Math.floor(Math.random() * (max - min + 1)) + min;

| result | Math.round() | Math.floor() |
|:------:|:------------:|:------------:|
|    0   |  0.0 - 0.499 |   0 - 0.999  |
|    1   |  0.5 - 1.499 |   1 - 1.999  |
|    2   |  1.5 - 2.499 |   2 - 2.999  |
|    3   |  2.5 - 2.999 |   3 - 3.999  |

您会看到03 产生它们的范围只有Math.random() 的一半,而不是其他所有范围。

【讨论】:

  • 非常感谢!我只是想知道您在哪里或如何找到此参考资料? @托马斯
  • @UnorthodoxThing 参考什么?我从个人经验中知道了这个问题,并做了一个例子来证明它。
  • 认真的吗?您应该记录它或提交报告! o.o
  • 记录什么? Math.round() 可能会四舍五入,但 Math.floor() 不会?提到的“问题”是Math.round() 不适合这项工作,因为我在这个答案中解释了原因。使用的任何方法本身都没有错。
【解决方案2】:
Math.floor(Math.random() * (max - min + 1)) + min

会给你一个 [min, max] 范围内的随机数,因为 Math.random() 会给你 [0, 1)。让我们使用 Math.round 代替 Math.floor,Math.random() 给你 [0, 1),如果你将它乘以 10,你将得到 [0, 10)。这是一个浮点数,如果将其向上取整,您将得到 [0, 10] 为整数。但是,如果向下取整,则会得到 [0, 10) 为整数。

在大多数随机函数中,规范是返回 [min, max)。

为了回答你的问题,作者使用了 Math.floor,如果使用 Math.round,随机数将在 [min, max] 的范围内,而不是 [min, max+1]。

来自维基百科

间隔 主条目:区间(数学) 括号 ( ) 和方括号 [ ] 也可用于表示区间。符号 {\displaystyle [a,c)} [a, c) 用于表示从 a 到 c 的区间,该区间包含 {\displaystyle a} a 但不包括 {\displaystyle c} c。也就是说,{\displaystyle [5,12)} [5, 12) 将是 5 到 12 之间的所有实数的集合,包括 5 但不包括 12。这些数字可以尽可能接近 12,包括 11.999依此类推(任何有限数量的 9),但不包括 12.0。在一些欧洲国家,符号 {\displaystyle [5,12[} [5,12[ 也用于此。

【讨论】:

    【解决方案3】:

    Math.floor(Math.random()) 将始终返回0,而Math.round(Math.random()) 将返回0 or 1,因此对于Math.round(),随机数将遵循非均匀分布。这可能无法满足您的需求。

    【讨论】:

      猜你喜欢
      • 2016-08-02
      • 2023-03-22
      • 1970-01-01
      • 2010-12-20
      • 2011-02-01
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 2016-12-06
      相关资源
      最近更新 更多