Math.random()方法会返回介于 0(包含) ~ 1(不包含) 之间的一个随机数
假如想要拿到0-10之间的数,只需要将该方法的值*10 即Math.random()*10;
假如想要拿到0-20之间的数,同理,只需要将该方法的值*20 即Math.random()*20;
那么,想要拿到0-n之间的数,n是整十倍的数,即Math.random()*n。
想要拿到1-11之间的数呢?就是在0-10的基础上,加上1 即Math.random()*10+1;
即 想要拿到m-n+m之间的数,n是整十倍的数,即Math.random()*n+m。
拿到1-10之间的数呢?就是在0-9的基础上,加上1 即Math.random()*9+1;
即 想要拿到m-n之间的数,即Math.random()*(n-m)+m
此时,拿到的数值都是小数,而且都是大于m小于n的值。
舍掉小数点后的数值的方法有很多,如parseInt(),Math.ceil(),Math.floor(),Math.round()
如果使用parseInt()或Math.floor(),如在0-1之间,永远拿不到1的情况,不满足
如果使用Math.ceil(),如在0-1之间,除非拿到的值是0,否则都是拿到1的情况,虽然满足,但是概率不平均
使用Math.round()是最合适的,如在0-1之间,0.5及以上的值会返回1,0.5以下的值返回0。概率平均。
所以,拿到m-n之间的数,m不等于n,Math.round(Math.random()*(n-m)+m)
获取不重复的随机整数:(参数:随机数个数,最小值,最大值)
function randomArr(params) { params = { ...{ length: 5, min: 2, max: 32 }, ...params }; let { length, min, max } = params; if ( typeof length != "number" || typeof min != "number" || typeof max != "number" || max <= min || length <= 0 ) { return []; } if(max - min < length) { length = max - min + 1; } let arr = []; for (let i = 0; i < length; i++) { let num = Math.round(Math.random() * (max - min)) + min; if (!arr.includes(num)) { arr.push(num); } else { i-=1 } } return arr; } var result0 = randomArr(); console.log(result0); // [ 7, 15, 18, 16, 4 ] var result1 = randomArr({}); console.log(result1); // [ 17, 24, 27, 25, 8 ] var result2 = randomArr({ length: 3 }); console.log(result2); // [ 24, 4, 27 ] var result3 = randomArr({ min: 0 }); console.log(result3); // [ 21, 11, 8, 18, 13 ] var result4 = randomArr({ max: 20 }); console.log(result4); // [3, 7, 11, 15, 8] var result5 = randomArr({ max: 4 }); console.log(result5); // [3, 4, 2]