标签:
查阅w3school,得到的答案是:Math.random()返回 0 到 1 之间的随机数,即(0,1)。
查阅MDN(Mozilla开发者网络),得到的解释是:Math.random()返回大于等于0,小于1的随机数,即[0,1)。
而实际上呢?我们来做个试验:循环利用Math.random()生成一百万个随机数,统计其中0出现的次数
var m = 0, n = 1000000; for (var i = 0; i < n; i++) { Math.random()===0 ? m++ : ""; }; console.info("0出现的次数是:"+m+"次");
输出结果是:
0出现的次数是:0次
0次,是循环的次数太少了吗?那么将循环次数改为1亿次吧
输出结果是:
0出现的次数是:0次
结果还是0次!多次试验都是0次,0从未出现过。从这一点看来,w3school的解释似乎更符合实际。
Math.random()还有一个有趣的现象:
我们知道可以利用Math.random()来返回两个整数之间的一个随机数(包括这两个整数本身),比如返回1~10之间的随机整数,理论上1-10每个数字出现的概率都是10%,但事实上我发现1和10出现的概率大约是其它数字出现概率的一半!所以用Math.random()来生成随机数做的抽奖程序是不公平的。
for (var i = 0; i < 10; i++) { ~function(){ var x = i+1, m = 0, n = 1000000; for (var j = 0; j < n; j++) { Math.round((Math.random())*9+1)===x ? m++ : ""; }; console.info(x+"出现的次数是:"+m+"次","概率:"+m/n*100+"%"); }(i) };
输出:
1出现的次数是:55587次 概率:5.5587%
2出现的次数是:111062次 概率:11.1062%
3出现的次数是:110879次 概率:11.08790
4出现的次数是:111146次 概率:11.1146%
5出现的次数是:110554次 概率:11.0554%
6出现的次数是:111610次 概率:11.161%
7出现的次数是:111345次 概率:11.1345%
8出现的次数是:110724次 概率:11.0724%
9出现的次数是:110450次 概率:11.045%
10出现的次数是:55560次 概率:5.556%
By 王美建 from http://www.cnblogs.com/wangmeijian/p/4235907.html
转载请保留署名及出处
标签:
原文地址:http://www.cnblogs.com/wangmeijian/p/4235907.html