js产生1-20之间的数,要求数越小出现的概率越高,要怎么写?

需要随机产生1-20之间的数,数字越小,出现的概率越高。
请教大家,该怎么写?

阅读 4.6k
3 个回答

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:
上面所说的:

两个Math.random()相乘落在0到0.5之间的概率是3 / 4,落在0.5到1之间的概率是1/4,因为只有当两次Math.random()的结果都在0.5以上时,结果才会在0.5到1之间。

落在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,所以上面的描述更正如下:

两个Math.random()相乘落在0到0.5之间的概率大于3 / 4,落在0.5到1之间的概率小于1/4,因为只有当两次Math.random()的结果都在0.5以上时,结果才有可能会在0.5到1之间。

感谢@manggo指正!

每次都重置种子也是这样吗?? 取1000次看看,每个数的出现的次数是否正态分布??如果是,那就是自己的感觉问题了,我也经常感觉,边界数好像一次也没有取到。

根据统计学原理,大次数随机后,每个数字出现的概率因该是同样高。所以希望出现的数尽量均匀,可以检测每次生产的数组,如果不符合你心中的随机规则,可以再递归一个。

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();
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题