# 随机数方法
内建函数
Math.random()
会创建一个在0
到1
之间(不包括1
)的随机数。
# 从 min 到 max 的随机数
编写一个 random(min, max)
函数,用以生成一个在 min
到 max
之间的随机浮点数(不包括 max
))。
我们需要将区间 0…1 中的所有值“映射”为范围在 min
到 max
中的值。
这可以分两个阶段完成:
- 如果我们将 0…1 的随机数乘以
max-min
,则随机数的范围将从 0…1 增加到0..max-min
。 - 现在,如果我们将随机数与
min
相加,则随机数的范围将为min
到max
。
函数实现:
function random(min, max) {
return min + Math.random() * (max - min);
}
alert( random(1, 5) );
alert( random(1, 5) );
alert( random(1, 5) );
# 从 min 到 max 的随机整数
创建一个函数 randomInteger(min,max)
,该函数会生成一个范围在 min
到 max
中的随机整数,包括 min
和 max
。
在 min..max
范围中的所有数字的出现概率必须相同。
# 简单但错误的解决方案❌
function randomInteger(min, max) {
let rand = min + Math.random() * (max - min);
return Math.round(rand);
}
alert( randomInteger(1, 3) );
这个函数是能起作用的,但不正确。获得边缘值 min
和 max
的概率比其他值低两倍。
发生这种情况是因为 Math.round()
从范围 1..3
中获得随机数,并按如下所示进行四舍五入
values from 1 ... to 1.4999999999 become 1
values from 1.5 ... to 2.4999999999 become 2
values from 2.5 ... to 2.9999999999 become 3
# 正确的解决方案✔
- 🔸调整取值范围的边界
function randomInteger(min, max) {
// 现在范围是从 (min-0.5) 到 (max+0.5)
let rand = min - 0.5 + Math.random() * (max - min + 1);
return Math.round(rand);
}
alert( randomInteger(1, 3) );
- 🔸使用
Math.floor
来取范围从min
到max+1
的随机数
function randomInteger(min, max) {
// here rand is from min to (max+1)
let rand = min + Math.random() * (max + 1 - min);
return Math.floor(rand);
}
alert( randomInteger(1, 3) );
现在所有间隔都以这种方式映射:
values from 1 ... to 1.9999999999 become 1
values from 2 ... to 2.9999999999 become 2
values from 3 ... to 3.9999999999 become 3