面试题:写一个函数,获取
0-10之间的随机数,包含0,也包含10。
我们知道Javascript中有Math.random()函数可以获取[0, 1)这种前开后闭区间的随机数。
场景一:前闭后开区间
前闭后开区间为:[x, y)
如果需要获取[0, 10)前开后闭区间的随机数,那么就需要将Math.random()乘10:
Math.floor(Math.random() * 10)
如果需要获取[0, y)前开后闭区间的随机数,那么就需要将Math.random()乘y:
Math.floor(Math.random() * y)
如果需要获取[x, y)前开后闭区间的随机数,那么就需要将Math.random()乘y,再将区间整体右移x:
x + Math.floor(Math.random() * y)
至此:一个通用的获取前闭后开区间的通用函数就有了。
function getRandom(x, y) {
return x + Math.floor(Math.random() * (y - x))
}
场景二:其他情况
其他情况有开区间(x, y),前开后闭区间(x, y]和闭区间[x, y]。
前闭后开区间直接利用Math.random()函数的前闭后开特性再加位移即可,而其他情况也都可以由前闭后开区间作为变种:
(x, y)相当于[x + 1, y)(x, y]相当于[x + 1, y + 1)[x, y]相当于[x, y + 1)
然后,再通过通用函数即可获取x和y范围内的随机数。
总结
在范围x和y内获取随机数的问题都可以转换为求解前闭后开区间的问题,只要掌握了内置函数Math.random(取值范围为[0, 1))前闭后开的特性,就可以通过通用函数x + Math.floor(Math.random() * (y - x))进行求解。