HI!!先来向大家说声新年快乐!!!每年只要到了这个时候,小弟我都会找几个朋友到公益彩券店刮一个倾家蕩产,不过这样一路走来,从一开始想要一夜致富到现在只想着不要输太多就好XDD,而过年的时候公益彩卷总是会加码一些彩卷的额外奖项,所以我们就来应景一下,试着做实做一个产生一组威力彩号码,那废话不多说,以下开始实做。
首先我们需要用到JS本身的Math.random()
函式,这个函数会随机产生出0~1之间的小数,如下例子:
Math.random(); //0.8961082300942438Math.random(); //0.009676286758744546Math.random(); //0.7722302289555816
但是他乱数产生小数并不是我们要的,那该如何让他随机产生整数呢?首先我们先观察这个函数的规律,因为他会随机产生0~1之间的小数,所以他会产生出的最大的数不会大于等于1也就是0.9999...9而最小的数不会等于0也就是0.0000...01,假设我们要让他产生的範围为威力彩可下注号码(01~38),可以搭配另一个JS的内建函式Math.floor()
来做到,这个函式会将所有的小数无条件捨去到比自身小的最大整数,也就是说当我们把Math.random()
的结果放到Math.floor()
中的时候,永远会得到0,因为就算是Math.random()
产生出的最大结果0.99...999也会被捨为0,如下例子:
Math.floor(Math.random()); //回传0Math.floor(0.99999999999); //回传0
那接下来就要同时使用Math.random()
和Math.floor()
两种方式来实做我们的function了,就我们刚才观察出来的Math.random()
他的最大值永远不会大于等于1,也就是说,如果我将Math.random()
产生出来的数去乘上2就会得到0~2之间的小数,乘上3就会得到0~3之间的小数,以此类推,所以利用这一点再搭配上Math.floor()
,当我们把Math.random()*2
放进Math.floor()
中就会得到0或1的结果,因为Math.random()*2
产生出来的值会是0.0000...02到1.9999...98之间的随机小数,最小的被捨去会得到0,最大的被捨去又会得到1,以下我们看实做:
Math.floor(Math.random()*2); //回传0或1Math.floor(Math.random()*3); //回传0或1或2Math.floor(Math.random()*5); //回传0或1或2或3或4Math.floor(Math.random()*50); //回传0或1或2或3...或49
根据上述的例子,我们可以先实做以下的function
function getRandom(x){ return Math.floor(Math.random()*x);};getRandom(3); //会回传0~2之间的随机数字getRandom(5); //会回传0~4之间的随机数字
其实上面的function已经和我们的目的非常接近了,只是function内还有两个问题需要排除,第一个是我们要的範围是不包括0的,第二个是他的範围会是到「x-1」而不是到「x」,不过这并不是什么大问题,因为我们只需要在得到的结果后方加上1就可以一次解决这两个问题,如下:
function getRandom(x){ return Math.floor(Math.random()*x)+1;};getRandom(3); //会回传1(0+1)~3(2+1)之间的随机数字getRandom(5); //会回传1(0+1)~5(4+1)之间的随机数字
如此就达到我们的目标了!!去乱数产生1~x之间的整数,所以我们在稍微修饰一下就可以拿来产生一组威力彩的号码了:
//宣告我们刚刚写好的取乱数的functionfunction getRandom(x){ return Math.floor(Math.random()*x)+1;};//再来写产生威力彩号码的functionfunction getPowerNum(){ //首先我们先宣告一个字串,用来装要回传的结果 var status = '第一区号码为:'; //宣告一个变数用来装随机产生的数字 var n = 0; //一注威力彩号码有6个所以我们让迴圈跑六次 for(i=0;i<=5;i++){ //用indexOf判断该数字之前有没有出现过 n = getRandom(38); if(status.indexOf(n)>0){ //如果有出现过就重跑一次迴圈 i-=1; continue; } else{ //没出现过的话就写进字串里 status += n + ' '; }; }; //因为威力彩有分两区,第二区为01~08随机一数字,所以我们在回传时加上。 return status + '第二区号码为:' + getRandom(8);};getPowerNum();//回传结果:"A组号码为:19 11 2 30 20 8 B组数字为:2"
这么一来就完成了我们最终的目的了,不过这只是基本的取乱数的方法,因为在这个例子都是从1~x选出随机乱数,但是实务上我们遇到的需求可能千奇百怪,说不定会需要从x~y之间的随机乱数,这个下次发文的时候再继续实做从一个範围中去产生乱数。
以上如果我有观念错误或解释不清楚的地方,还麻烦各位大大指点了,谢谢大家!
最后再向大家说声新年快乐!!