纯js实现随机整数[m,n],处理出现概率不相等的问题
1、可以使用 parseInt(取整)会智能识别 ceil(向上取整) floor(向下取整) round(四舍五入)
直接上代码
法1:使用四舍五入
function randomRound(m, n) {
return Math.round((Math.random() * (n - m) + m));
}
console.log(randomRound(3, 5));
法2 使用向下取整(parseInt和floor基本一致);
function randomCeil(m, n) {
return Math.ceil(Math.random() * (n - m) + m); // 向上取整
}
console.log(randomCeil(3, 5));
法3 使用向上取整
function randomFloor(m, n) {
return Math.floor((Math.random() * (n - m + 1) + m)); // 向下取整
}
console.log(randomFloor(3, 5));
方法1: 四舍五入出现的整数的概率是不均等的,假设按照 0-1 为一个区间算。
m 出现的概率是 半个区间
m+1 出现的概率是 一个区间
......
n 出现的的概率是 半个区间
方法2:向上取整 ceil 出现的概率任然是不均等的
m 出现的概率 ,相当于 random()中 0 出现的概率。
测试一个 Math.random()
0.009367313405289845
m+1 出现 为一个区间
......
n 出现的概率为一个区间
方法3:向下取整,floor这个出现的概率还算是基本均等,和parseInt 基本一致。
方法2的改造。
function randomCeil2(m, n) {
return Math.ceil(Math.random() * (n - m + 1) + m - 1);
}
console.log(randomCeil2(3, 5));
思路,刚开始的Math.random * (n - m) 区间为 [0 , n)
使区间变大一位 Math.random * ( n - m + 1) 区间变为 [0 , n - m + 1)
加上基础值, Math.random * ( n - m +1 ) + m 区间变为 [m , n + 1)
减去多加的1 , 区间变为 [m - 1, n);
向上取整 区间变为 [m - 1 , n];
扫描二维码关注公众号,回复:
8554821 查看本文章
此时 m - 1 取到的概率,就像是 Math.random() 的0 取到的概率一样低
m 的概率为 一个区间
m+1 的概率为 一个区间
…
n的概率为 一个区间, 可以保证概率大致相等