繁体   English   中英

Math.floor(Math.random() * (Max - Min + 1) + Min) 在 JavaScript 中如何工作? (理论)

[英]How does Math.floor(Math.random() * (Max - Min + 1) + Min) work in JavaScript? (Theory)

我在freecodecamp.org学习 JavaScript,Basic JavaScript。在阶段103/110有一个创建 function 的任务需要 2 arguments(最小值和最大值)和它们之间的 function。应该返回一个随机数给出了公式,我做了任务并完成了它,但我不太明白公式为什么有效。

function randomRange(myMin, myMax) {
  return Math.floor(Math.random() * (myMax - myMin + 1) + myMin);
}
console.log(randomRange(10, 20))

这是代码。

这是公式Math.floor(Math.random()*(max - min + 1) + min 。你能解释一下这个公式吗?为什么会这样?

我将解释这个公式:

Math.floor(Math.random() * (myMax - myMin + 1) + myMin);

假设我们想要一个 5-15 的随机数(包括 5 和 15 作为可能的结果)。 好吧,我们将不得不使用 Math.random(),它只产生从 0 到大约 0.99999999999999 的值,所以我们需要做两个技巧才能使用它。

第一个技巧是认识到 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() 设为 integer 时,它会将结果降至 9,因此我们需要在此处添加 1 以使最大可能值为 10 而不是 9。这就是公式的+ 1部分做。


让我们通过一个例子来完成这个。

Math.random()最低可以为0 ,最高可以为0.99999999999999 (从不为 1)。 让我们看看这两种情况会发生什么,看看范围是如何产生的。

如果我们运行我们调用randomRange(5, 15)并且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)并且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。

一步步:

  • Math.random()返回 [0, 1) 范围内的浮点数,即 0 是可能的结果,但 1 不是。

  • (myMax - myMin + 1)是一个 integer ,表示您可以作为最终结果获得的可能不同整数的数量。

  • Math.floor(Math.random() * (myMax - myMin + 1)因此是 [0, myMax - myMin + 1) 范围内的浮点数

  • 通过将myMin添加到其中,您将获得 [ myMin , myMax + 1) 范围内的浮点数

  • 最后,通过应用Math.floor() ,可能的值被限制为 [ myMin , myMax + 1) 范围内的整数,对于整数来说,它等价于 { myMin ... myMax }。

  • Math.random() 返回 [0, 0.999999] 范围内的浮点数 *(myMax - myMin + 1) 返回 integer 值

    例如,如果您的随机范围是 randomRange(10, 20),(myMax - myMin + 1) 返回 integer 值 (20-10+1),即 11。

    有 11 个可能的整数为 (10,11,12,13,14,15,16,17,18,19,20)

*Math.floor(Math.random() * (myMax - myMin + 1)返回(0,myMax-myMin+1)范围内的浮点数

(0.99999999999999 * (20 - 10 + 1))=10.99999999999

*因此我们添加 myMin 以获得范围内的浮点数 (myMin,myMax+1)

(0.99999999999999 * (20 - 10 + 1)+10)=20.99999999999

*最后,通过应用 Math.floor() 将数字向下舍入到最接近的 integer 作为 20

暂无
暂无

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

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