Math.random 概率异常?连续7次成功概率不符预期
问题排查与解决
首先明确:问题和Math.random()无关,是你的概率计算逻辑和统计指标定义错了,拆解如下:
1. 单次成功概率完全算错了
你写的delay = Math.floor(Math.random()*5)*10,Math.random()*5生成[0,5)区间的数,取整后得到0,1,2,3,4这5个整数,乘以10后对应0,10,20,30,40。其中满足delay <=30的是前4个值,所以单次成功概率是4/5=80%,不是你以为的3/4(75%)。
连续7次成功的理论概率是0.8^7≈0.2097(约21%),和你实际看到的0.26已经很接近——差距来自第二个错误。
2. 统计比率的计算逻辑错误
你用wins/restarts来计算“连续7次成功的概率”,但这个比值的意义是成功次数÷失败次数,而非成功次数÷总尝试次数(总尝试次数=成功次数+失败次数)。
按照正确的概率计算方式,应该用wins/(wins + restarts):
- 当理论概率是0.2097时,失败次数是成功次数的
(1-0.2097)/0.2097≈3.77倍,那么wins/restarts≈1/3.77≈0.265,正好和你看到的0.26左右完全吻合。
修复建议
- 若要测试连续7次成功的真实概率,把统计代码里的比率计算改成
wins/(wins + restarts); - 若确实需要单次3/4的成功率,修改delay生成逻辑,比如改成
delay = Math.floor(Math.random()*100),再判断delay <=75,这样逻辑更直观; - 递归调用
rainbow()可能导致调用栈溢出,建议改成setTimeout(rainbow, 0)或用循环避免深层递归。
内容的提问来源于stack exchange,提问作者Ives
相关产品推荐
相关产品推荐

