Math.random()*(y-x)+x 公式分析
欢迎
- 本文章主要使用
JavaScript
语言,但是思想是通用的
在一些编程语言中,Math.random()
只能生成一个零到一之间[0,1)的数字
我们希望生成一个[0,1)
的数字
正常的使用Math.random()
这个方法即可
// 生成随机数
console.log(Math.random());
// 重复运行3次
// 输出结果 0.824860163382928
// 输出结果 0.2828677085558433
// 输出结果 0.7065201777863614
我们希望生成[0,10)
的数字
我们只需要把这个随机数乘一个数即可
console.log(Math.random() * 10);
// 重复运行3次
// 输出结果 7.475350215085657
// 输出结果 9.37430923250589
// 输出结果 3.7502072379588847
我们想象一个不可能情况可以帮助我更快理解
假设:我们现在的随机数是1,这个1也是我们目前最大的随机数,我们目前的方法Math.random()
我们目前的区间是[0,1)
,我们希望区间能够扩大10倍,于是我们左右区间都乘了10,0乘10还是0,但是1乘10等于10,所以我们Math.random() * 10
的区间是[0,10)
所以==我们希望他的最大区间是多少我们就在这个公式后面乘多少==,例如我希望他生成0到97之间的数字,公式就会长成这个样子
Math.random() * 97
我们希望生成一个[x,y)
的数字
假设我们现在需要生成一个3到7之间的数字,我们先写出他的区间[3,7)
,我们可以让左区间归零,我们把左右区间同时减去3(之后会加回来)
[
3
−
3
⏞
左区间
,
7
−
3
⏞
右区间
)
→
[
0
,
4
)
[\overbrace{3-3}^{左区间} ,\overbrace{7-3}^{右区间}) \rightarrow [0,4)
[3−3
左区间,7−3
右区间)→[0,4)
现在我们的区间长成这个样子[0,4)
,我们就可以用上面的方法写出我们的公式
console.log(Math.random() * 4);
// 重复运行3次
// 输出结果1.2476033188729243
// 输出结果 1.330843857626764
// 输出结果 3.176887420042733
然后我们现在让他的值移动到[3,7)
,我们可以让最终结果再加3,就可以把一开始减去的给重新加回来
for(let i = 0;i<3;i++){
console.log(Math.random() * 4 + 3);
}
// 输出结果
// 输出结果 3.693767070707926
// 输出结果 6.000697646107264
// 输出结果 5.153719945106879
我们现在就应该发现了,这个4代表的其实是我们左区间被移动回原点时我们右区间的值,这个值等同于左右区间的差,等同于右区间减去左区间
KaTeX parse error: Expected 'EOF', got '&' at position 2: &̲&左区间被移动回原点时我们右区…
既然这个值等于右区间减去左区间,我们期待的随机数是[x,y)
,那么这个值自然就是y-x
,然后我们再加上我们移动的数字x,最终我们公式长成这样
M
a
t
h
.
r
a
n
d
o
m
(
)
⏞
生成一个
0
到
1
之间的数
×
(
y
−
x
)
⏞
左右区间的差
+
x
⏞
将左区间从
0
增加到
x
\overbrace{Math.random()}^{生成一个0到1之间的数}\times\overbrace{(y-x)}^{左右区间的差}+\overbrace{x}^{将左区间从0增加到x}
Math.random()
生成一个0到1之间的数×(y−x)
左右区间的差+x
将左区间从0增加到x