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