繁体   English   中英

为什么Math.floor((Math.random()* 999999)+ 100000)不能可靠地产生6位数字?

[英]Why isn't Math.floor((Math.random() * 999999) + 100000) reliable for producing 6 digit numbers?

我已经看过其他一些问题,但是所有这些问题的答案都是令人困惑困惑的

我想要一个随机的6位数字,该脚本在大多数情况下都可以正常工作-但是它也会在大约20%的时间内生成7位数字。

Math.floor((Math.random() * 999999) + 100000)

我的问题:

  1. 为什么?
  2. 避免这种情况的正确方法?

请不要建议使用子字符串或类似的东西,因为这有点hack

这是一个简单的计算范围误差。 注意:以下文字使用[]表示包含范围,使用()表示排除范围。

要获得范围[100000,999999],它在整数数学中等于[100000,1000000),您需要获得一个范围为[0,900000)的数字,然后加100000,例如

Math.floor(900000 * Math.random()) + 100000

该因子是900000而不是899999,因为Math.random()函数产生的数字范围为[0,1),即自身不包括1。

问题出在你的数学上。

Math.random产生一个从0.0到1.0的浮点数。 在最坏的情况下,将1.0与999999相乘,再加上100000。 结果为1099999.0(最大情况下)。

该行应始终产生一个6位数的数字

Math.floor((Math.random() * 899999) + 100000)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM