为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 Math.floor() 优于 Math.round()?

为什么 Math.floor() 优于 Math.round()?

侃侃尔雅 2021-08-20 16:51:49
我在 FreeCodeCamp 中发现,解决在范围内获取随机整数的问题是使用Math.floor. 四舍五入是不准确的。它返回等于或小于。这不是我想的。这是给定的公式: Math.floor(Math.random() * (max - min + 1)) + min有谁知道为什么它更多地用于四舍五入到最接近的整数?
查看完整描述

3 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

摘要:由于与Math.round()中值min和max均不足。


让我们举个例子,比较一下分别使用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  |

您会看到这一点,0并且3产生它们的范围只有Math.random()示例中所有其他范围的一半。


查看完整回答
反对 回复 2021-08-20
?
慕村9548890

TA贡献1884条经验 获得超4个赞

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[] 也用于此目的。


查看完整回答
反对 回复 2021-08-20
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

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


查看完整回答
反对 回复 2021-08-20
  • 3 回答
  • 0 关注
  • 136 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信