我来解释一下这个公式:
Math.floor(Math.random() * (myMax - myMin + 1) + myMin);
假设我们想要一个 5-15 之间的随机数(包括 5 和 15 作为可能的结果)。好吧,我们将不得不使用 Math.random(),它只产生从 0 到大约 0.999999999999999 的值,所以我们需要做两个技巧才能处理这个问题。
第一个技巧认识到 Math.random() 的最低可能返回值是 0,并且 0 乘以任何值都是 0,因此我们需要从 0 开始我们的范围,并在最后进行调整以解决这一问题。我们不是从头开始计算 5-15,而是认识到 5-15 中有 11 个值(5、6、7、8、9、10、11、12、13、14 和 15),并计算出这么多值。从 0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 到使用 0-10 作为我们的范围。这就是myMax - myMin
公式的一部分是这样的。它将我们的新最大值定义为 10。然后,在计算结束时,我们只需将 5 添加回我们得到的结果,以使可能的结果范围从 0-10 更改为 5-15。这就是+ myMin
公式的一部分是这样的。
第二招认识到将 Math.random() 乘以新的最大范围 10 只能得到高达 9.999999999999 左右的结果,因为 Math.random() 只能高达 0.99999999999 左右(实际上从来不是 1)。当我们稍后使用 Math.floor() 使其成为整数时,它会将结果降低到 9,因此我们需要在那里加 1 以使最大可能值变为 10 而不是 9。这就是+ 1
公式的一部分是这样的。
让我们通过一个示例来结束这一点。
Math.random()
can be 0
最低且大约0.99999999999999
最高(绝不是 1)。让我们看看这两种情况会发生什么,看看这个范围是如何计算的。
如果我们运行我们调用过的案例randomRange(5, 15)
and Math.random()
给我们 0,这就是我们最终得到的结果:
Math.floor(Math.random() * (myMax - myMin + 1) + myMin);
=
Math.floor(0 * (15 - 5 + 1) + 5);
=
Math.floor(0 * 11 + 5);
=
Math.floor(0 + 5);
=
Math.floor(5);
=
5
所以可能的最小值是 5。如果我们运行我们调用过的情况randomRange(5, 15)
and Math.random()
给我们0.99999999999999
,这就是我们最终得到的结果:
Math.floor(Math.random() * (myMax - myMin + 1) + myMin);
=
Math.floor(0.99999999999999 * (15 - 5 + 1) + 5);
=
Math.floor(0.99999999999999 * 11 + 5);
=
Math.floor(10.9999999999999 + 5);
=
Math.floor(15.9999999999999);
=
15
所以可能的最大值是 15。