今天谈谈随机数,随机数就是Math.random() 生成的是 0-1取不到1的值,取0的几率也非常低,所以我们平时用它*一个值然后向下取整得到一系列随机数,随机数出现的机率是相同的,一般可以使用列表进行测试。
既然是算法,就不得不提随机数的一些简单算法:
1.二分法
2.不平均法
3.不平均平均法
先来检测一下random是否是平均的
let list = []
function x(){
return Math.floor(Math.random()*10)+1
}
for(let i = 0;i<2000;i++){
let k = x()
list[k]=list[k]??0
list[k]++
}
console.log(list)
//[空, 207, 228, 205, 196, 186, 211, 182, 186, 183, 216]
可以看出大概都在200左右,相对平均,那如何用这个能输出1-10的随机函数来输出1-8呢?
最简单的办法是这样
function x(){
return Math.floor(Math.random()*5)+1
}
当然 算法就是有边界条件,比如上图是一个用了很久的算法,我们要在这个算法的基础上封装一个新的算法,如何解决?
let list = []
function x(){
return Math.floor(Math.random()*10)+1;
}
function x_02(){
let num = x()
return num>5?1:0
}
function js(){
let num01=x_02()
let num02=x_02()<<1
let num03=x_02()<<2
return num01+num02+num03+1
}
for(let i = 0;i<10000;i++){
let m = js()
list[m]=list[m]??0
list[m]++
}
console.log(list)
//[空, 1174, 1282, 1220, 1247, 1260, 1247, 1272, 1298]
那如果不是平均分配呢?
function x(){
return Math.floor(Math.random()*10)+1;
}
function x_02(){
let num = x()
return num>7?1:0
}
虽然他本来是1-10 但是经过x_02 出现0和1的概率已经不是平均出现了,这时候我们该如何改变?
虽然知道0和1不是均率出现,但是我们能看到,它必然只会出现0和1,那从这方面着手,判断0和1的出现模式即可
function x_03(){
let num1 = x_02()
let num2 = x_02()
while(num1==num2){
num1 = x_02()
num2 = x_02()
}
return num1==1?0:1
}