为什么n't Math.floor((Math.random() * 999999) + 100000)可靠地生

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

本文关键字:Math 999999 100000 random floor 为什么      更新时间:2023-09-26

我看了其他一些问题,但它们的答案都是脱节的,令人困惑的。

我想有一个随机的6位数字,大多数时候这个脚本工作-但是它也产生7位数字大约20%的时间。

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)