zoukankan      html  css  js  c++  java
  • 获取随机时间,且不同时间段的概率不等的计算方法

    昨天老公给我提出一个需求: 给出两个时间戳,随机返回这个时间段里的一个时间,但是有个要求,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之间的一个随机数,最后合并数组,随机取一个时间.



  • 相关阅读:
    软考
    码云
    vue和bpmnjs
    工作流引擎
    net core restapi
    工厂模式
    sqlmanage
    类的扩展
    导出excel
    拼图
  • 原文地址:https://www.cnblogs.com/liulangmao/p/4492708.html
Copyright © 2011-2022 走看看