an4*_*911 3 javascript random math function
我正在freecodecamp.org学习 JavaScript ,Basic JavaScript。在阶段103/110中,有一个任务是创建一个函数,该函数接受 2 个参数(最小值和最大值),并且该函数应返回它们之间的随机数。给出了公式,我做了任务并完成了它,但我不太明白为什么这个公式有效。
function randomRange(myMin, myMax) {
return Math.floor(Math.random() * (myMax - myMin + 1) + myMin);
}
console.log(randomRange(10, 20))
Run Code Online (Sandbox Code Playgroud)
这是代码。
这就是公式Math.floor(Math.random()*(max - min + 1) + min。您能解释一下这个公式以及为什么它有效吗?
Aar*_*zyk 10
我来解释一下这个公式:
Math.floor(Math.random() * (myMax - myMin + 1) + myMin);
Run Code Online (Sandbox Code Playgroud)
假设我们想要一个 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()可以是0最低值,也可以是大约0.99999999999999最高值(绝不是 1)。让我们看看这两种情况会发生什么,看看这个范围是如何计算的。
randomRange(5, 15)如果我们运行调用并给出 0 的情况Math.random(),那么我们最终会得到以下结果:
Math.floor(Math.random() * (myMax - myMin + 1) + myMin);
Run Code Online (Sandbox Code Playgroud)
=
Math.floor(0 * (15 - 5 + 1) + 5);
Run Code Online (Sandbox Code Playgroud)
=
Math.floor(0 * 11 + 5);
Run Code Online (Sandbox Code Playgroud)
=
Math.floor(0 + 5);
Run Code Online (Sandbox Code Playgroud)
=
Math.floor(5);
Run Code Online (Sandbox Code Playgroud)
=
5
Run Code Online (Sandbox Code Playgroud)
randomRange(5, 15)所以可能的最低值是 5。如果我们运行我们调用并Math.random()给出 的情况0.99999999999999,这就是我们最终得到的结果:
Math.floor(Math.random() * (myMax - myMin + 1) + myMin);
Run Code Online (Sandbox Code Playgroud)
=
Math.floor(0.99999999999999 * (15 - 5 + 1) + 5);
Run Code Online (Sandbox Code Playgroud)
=
Math.floor(0.99999999999999 * 11 + 5);
Run Code Online (Sandbox Code Playgroud)
=
Math.floor(10.9999999999999 + 5);
Run Code Online (Sandbox Code Playgroud)
=
Math.floor(15.9999999999999);
Run Code Online (Sandbox Code Playgroud)
=
15
Run Code Online (Sandbox Code Playgroud)
所以可能的最大值是 15。