Javascript中范围随机函数讨论

在javascript中,产生随机的函数只有Math.random(),而且它产生的随机数范围只有[0,1),大大限制了我们的使用,在使用的时候,我们还要自己构造能产生自定义范围的函数。下面我们就常见的一些方法进行讨论。有不对的地方,希望大家能指正。

先来一个网上的例子:

function getRandom(n){
    return Math.floor(Math.random()*n+1);
}
//产生0~100的随机数 getRandom(100)
//产生0~999的随机数 getRandom(999)

咋一看,没什么问题,能满足我们的需要,但是如果我们仔细去想想的话,就会发现一个问题——无法随机到“0”。

为什么呢?random的随机范围是[0,1),极限状态下我们随机到了“0”,0*100还是0,再加上1就是1,然后就是floor函数,它是一个向下取整函数,由于1是整数,所以结果就为1,也就是无法随机到0,

其次,这个函数只能随机0开始的范围,如果我们想要不是0开头的范围随机,还要自己再加上一个基数,显得有点麻烦,于是我们可以改进上面的函数。

首先,我们需要函数能输入范围,

function getRandom(a,b){
    var index = Math.min(a, b); //获取范围偏移
    var rang = Math.abs(a - b); //获取范围区间
}

然后就是随机数的产生,这里我们需要了解一些基本的函数和方法。

Math.random(); // 结果为0-1间的一个随机数(包括0,不包括1)
Math.floor(num); // 参数num为一个数值,函数结果为num的整数部分
Math.round(num); // 参数num为一个数值,函数结果为num四舍五入后的整数

Math.ceil(n); // 返回大于等于n的最小整数
用Math.ceil(Math.random()*10);时,主要获取1到10的随机整数,取0的几率极小

Math.round(n); // 返回n四舍五入后整数的值
用Math.round(Math.random());可均衡获取0到1的随机整数
用Math.round(Math.random()*10);时,可基本均衡获取0到10的随机整数,其中获取最小值0和最大值10的几率少一半

Math.floor(n); 返回小于等于n的最大整数
用Math.floor(Math.random()*10);时,可均衡获取0到9的随机整数

从上面可以看出,就现有的几种随机方法,只有floor方法能保证所有产生的随机数的出现概率一样。所以,我们产生随机的方法就采用floor方法。

其次,随机范围的问题。用Math.floor(Math.random()*10)的方法时,产生的随机整数是0~9,如果我们要想产生0~10的整数时,则需要把范围扩大一个整数,即修改成Math.floor(Math.random()*11),这样就能产生0~10之间的等概率随机整数了。

于是我们的函数产生了。

function getRandom(a,b){
    var index = Math.min(a, b); //获取范围偏移
    var rang = Math.max(a, b) - Math.min(a, b); //获取范围区间
    return Math.floor(Math.random()*(rang+1))+index;
}

这个函数有下面几个特点:

  1. 能输出a~b之间的等概率随机整数
  2. 范围不限,可以是正数、负数。

到此结束,如果有不对的地方,望各位不吝指正。