获取随机时间,且不同时间段的概率不等的计算方法

昨天老公给我提出一个需求: 给出两个时间戳,随机返回这个时间段里的一个时间,但是有个要求,9:00-23:00之间的概率是80%,23:00-9:00之间的概率是20%.

听起来好像挺简单...但细思极恐啊!!!

我按照一般的思路,就是从一段数字之间随机获取一个数,其中某些数字的概率要高,某些数字的概率要小...

首先从1和2,返回1的概率为0.8,返回2的概率为0.2开始,把0-1数轴分成80%和20%两段,如果落在前一段,就返回1,落在后一段,就返回2.

        var rNum = Math.random();
        if(rNum<0.8) {
            return 1
        }
        else {
            return 2
        }

顺着这个思路,就是把起点和终点在数轴上的位置,改变原来一一对应的关系,按照我希望的比例来进行对应,通过一番计算,我又写了a-b两个数之间取随机数,返回a,a+2,a+4...的概率为20%,返回a+1,a+3,a+5...的概率为80%,这样的函数...

function getNumber(a,b){
    var r = Math.random()*(b-a);
    //0-(b-a)
    var mini = r - Math.floor(r);
    var big = Math.floor(r);
    if((big%2==0 && mini<0.4) || (big%2==1)) {
        r = Math.floor(r)
    }
    else {
        r = Math.ceil(r)
    }
    if((r+a)%2==0){
        shuang+=1;
    }
    else if ((r+a)%2!==0){
        dan+=1
    }
    return shuang/dan;

}

var dan = 0;
var shuang = 0;
for(var i=0; i<100; i++){
    console.log(getNumber(62,10000001))
}

走到这一步,接下来我就考虑如果与时间戳对应起来.......越想越觉得十分纠结,好像回到了做高数的年代......正在这时,老公给我说了他的思路,先生成一个时间戳,然后再算个概率,考虑是否要留下这个时间戳,或者再生成...虽然不是很对,但是一下子启发了我...于是,马上就有了下面这个思路:

首先,生成时间区间里的时间戳,判断这个时间戳所在的小时是在9:00-23:00之间,还是在23:00-9:00之间,如果在9:00-23:00之间,就放进'arr1'里,如果在23:00-9:00之间,就放进'arr2'里,直到'arr1'里有4个时间数据,'arr2'里有1个时间数据.然后合并'arr1'和'arr2',最后从合并的数组里随机取出一个来.一下子简单了! 换个思路,问题就迎刃而解了! 

    /***************t1-t2随机取整***************/
    function getRandom(t1,t2){
        var r = Math.round(Math.random()*(t2-t1));
        return r+t1;
    }

    /***************arr数组中随机取一项***************/
    function getRandomArr(arr){
        var index = getRandom(0,arr.length-1);
        return arr[index]
    }

    /***************arr数组中随机取一项***************/
    function getTimeArr(t1,t2) {
        var arr1 = [];
        var arr2 = [];
        function pushTime(){
            var t = getRandom(t1,t2);
            var h = new Date(t).getHours();
            if(h>=8 && h<=22){
                if(arr1.length<4) arr1.push(t);
                return judgeArr()
            }
            else {
                if(arr2.length<1) arr2.push(t);
                return judgeArr()
            }
        }
        function judgeArr(){
            if(arr1.length==4 && arr2.length==1){
                Array.prototype.push.apply(arr1,arr2);
                return arr1
            }
            else {
                return pushTime()
            }
        }
        return pushTime();
    }

    var date1 = new Date(2015,0,1,0,0,0,0).getTime();
    var date2 = new Date(2015,1,1,0,0,0,0).getTime();

    var time = getRandomArr(getTimeArr(date1,date2));

    alert(new Date(time).getHours());

有个这个思路,其实还可以更简单,比如我先随机生成一个时间,只取其年月日分秒毫秒,而小时这个数,我循环四次,每次都取9:00-23:00之间的一个随机数.然后再循环一次,只取23:00-9:00之间的一个随机数,最后合并数组,随机取一个时间.



 

posted @ 2015-05-10 19:39  诗&远方  阅读(1737)  评论(2编辑  收藏  举报