Math.random()的值有没有可能是0或1?你确定?

查阅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%

 那么抽奖算法怎么写才公平?很简单方法有很多种,我说一种简单的,将1至10存入数组A,打乱顺序,利用Math.random()生成0~9的随机数S用来做索引,每抽完一次,将数组A内的元素顺序再随机排列一次,这样,数组A里的任意一个数字都不会一直呆在数组头部或尾部,代码如下:

<!DOCTYPE html>
<html>
<body>
<button id="lottery">抽奖</button><span id="result"></span>
<script type="text/javascript">

var max = 10,
    arr = [];

for(var i=0;i<max;i++){
    arr.push(i+1);
}
arr.sort(function(a,b){
    if(0.5-Math.random()>0){
        return a-b;
    }
    return b-a;
})

function lottery(){
    return arr[Math.round( Math.random()*(max-1) )];
}

document.getElementById("lottery").onclick=function(){
    arr.sort(function(a,b){
        if(0.5-Math.random()>0){
            return a-b;
        }
        return b-a;
    })
    document.getElementById("result").innerHTML = "此次中奖号码是:"+lottery()
}
</script>
</body>
</html>

 

 

By 王美建 from http://www.cnblogs.com/wangmeijian/p/4235907.html

转载请保留署名及出处

你可能感兴趣的:(Random)