写个随机函数获取0-10的随机数,简单吗?

134 阅读1分钟

面试题:写一个函数,获取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)

然后,再通过通用函数即可获取xy范围内的随机数。

总结

在范围xy内获取随机数的问题都可以转换为求解前闭后开区间的问题,只要掌握了内置函数Math.random(取值范围为[0, 1))前闭后开的特性,就可以通过通用函数x + Math.floor(Math.random() * (y - x))进行求解。