[笔记][JavaScript]用Math.random()取得乱数的技巧

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之间的随机乱数,这个下次发文的时候再继续实做从一个範围中去产生乱数。

以上如果我有观念错误或解释不清楚的地方,还麻烦各位大大指点了,谢谢大家!

最后再向大家说声新年快乐!!http://img2.58codes.com/2024/emoticon57.gif


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章