JavaScript的Math.random()真的能返回0吗?实测疑问与分析
Math.random() 真的能返回0吗?
根据MDN的定义,Math.random()确实会返回大于等于0且小于1的伪随机数,理论上存在返回0的可能,但这个事件的概率极低,低到你在常规测试中几乎不可能碰到。
为什么你的测试没出现0?
现代JavaScript引擎(包括Node.js v18使用的V8引擎)中,Math.random()的底层实现通常基于64位伪随机数生成算法(比如xorshift128+)。它的逻辑是生成一个0到264-1之间的整数,然后除以264,得到[0, 1)区间的浮点数:
- 当生成的整数为0时,结果就是0;
- 其他情况则是介于(0, 1)之间的数。
得到0的概率是**1/264**,也就是约1/(1.8×1019)。你15分钟的测试,就算每秒能生成1亿次随机数(实际因为循环里有console.log,实际次数远低于这个数),总次数也只有约9×1010次——这个量级和1.8×1019比,差了8个数量级,相当于你在地球上找一粒特定的沙子,概率都比这个高。
你得到的最小数值5.2724491439448684e-12,对应的是生成的整数约为9.48×10^7,离0还有很大距离,完全符合伪随机数的分布规律。
你的测试代码
let countSmallNumber = 0; let temp = 0; console.time("loopTime"); while (countSmallNumber < 10) { temp = Math.random(); if (temp < 0.0000000001) { countSmallNumber++; console.log(`almost 0 => ${temp}`); } } console.timeEnd("loopTime");
内容的提问来源于stack exchange,提问作者Wahid Feb
相关产品推荐
相关产品推荐

