今天面试遇到一个很有趣的问题也没答上来,回来后搞了下实现如下。
解法:
该解法基于一种叫做拒绝采样的方法。主要思想是只要产生一个目标范围内的随机数,则直接返回。如果产生的随机数不在目标范围内,则丢弃该值,重新取样。由于目标范围内的数字被选中的概率相等,这样一个均匀的分布生成了。
显然rand7至少需要执行2次,否则产生不了1-10的数字。通过运行rand7两次,可以生成1-49的整数,
function ran7(){
return Math.ceil(Math.random()*7)
}
function rand10(){
let x=0;
while(x<40){
x=(ran7()-1)*7+ran7();
console.log(x)
}
return x%10+1;
}