需要随机产生1-20之间的数,数字越小,出现的概率越高。
请教大家,该怎么写?
根据统计学原理,大次数随机后,每个数字出现的概率因该是同样高。所以希望出现的数尽量均匀,可以检测每次生产的数组,如果不符合你心中的随机规则,可以再递归一个。
function randomArr(n) {
return [...Array(n)].map(num=> Math.floor(Math.random()* 20 + 1));
}
function ranYouWant() {
let arr = randomArr(100);
let len = arr.length;
let small = arr.filter(num => num < 10).length / len;
let big = arr.filter(num => num > 10).length / len;
if(Math.abs(big-small)<0.5) return arr;
return ranYouWant();
}
13 回答13.1k 阅读
7 回答2.3k 阅读
3 回答1.4k 阅读✓ 已解决
6 回答1.4k 阅读✓ 已解决
2 回答1.5k 阅读✓ 已解决
3 回答1.5k 阅读✓ 已解决
6 回答1.2k 阅读
1 + Math.floor(Math.random() * Math.random() * 20)
Math.random()
的几率是相等的,结果在0到1之间,落在0到0.5和0.5到1之间的概率都是0.5;两个
Math.random()
相乘落在0到0.5之间的概率是3 / 4
,落在0.5到1之间的概率是1/4
,因为只有当两次Math.random()
的结果都在0.5以上时,结果才会在0.5到1之间。所以多个
Math.random()
相乘会使数越小出现的概率越高。Update:
上面所说的:
落在0到0.5之间的概率是
3 / 4
,落在0.5到1之间的概率是1/4
,应该是不对
的。因为即使两次Math.random()
的结果都在0.5以上时,结果也不一定会在0.5到1之间,比如0.6 * 0.6 = 0.36; 0.7 * 0.7 = 0.49
,所以上面的描述更正如下:感谢@manggo指正!