您的位置 首页 java

JavaScript用Math.random()生成随机数

1. 基本概念

顾名思义,Math.random()方法就是用于生成随机数的,因为单词random的意思正是“随机的”。该方法生成的结果是 [0, 1) 范围内的浮点数,注意这是一个左闭右开的区间,即该区间包含0而不包含1。

官方文档指出Math.random()方法生成的随机数在该区间上要大致符合均匀分布。Math.random()的语法结构如下所示,可以看出它是没有参数的。

 Math.random();  

JavaScript引擎会自动设置随机数种子(seed),而没有提供任何途径让我们自己来完成这件事,但某些其它语言(比如C++,Java)则通常允许用户自主设置随机数种子。

2. 范围放缩

Math.random()方法的一个不足之处就是它只能随机生成 [0, 1) 范围内的数,而我们常常又需要其它范围内的随机数。其实这也不难,只要对Math.random()的结果进行适当的放缩就可以达到这一目的。为了叙述方便,在后面的说明中我们都约定n和m代表正整数且m大于n。

首先,假设我们需要随机生成 [0, n) 之间的所有数,那么只需将Math.random()的结果乘以n就可以了,正如下面的代码所做的那样。

 function getRandomFloat(n) {
    return Math.random() * n;
}  

其次,我们可能需要的是随机生成 [0, n] 范围内的整数,注意此时n也包含在生成结果中。我们先将Math.random()的结果乘以 n+1,得到 [0, n+1) 范围内的浮点数。然后,再对该范围内的数进行向下取整(使用Math.floor()方法)就可以得到 [0, n] 范围内的整数了。

 function getRandomInt(n) {
    var number = Math.random() * (n + 1);
    return Math.floor(number);
}  

以上两种方法生成的随机数都是从0开始的,如果我们需要的是任意区间的随机数呢?假设我们需要随机生成 [n, m] 范围内的整数,那么我们先随机生成 [0, m – n] 范围内的整数,再将它加上n就可以得到 [n, m] 内的整数了。

 function getRandomIntSection(n, m) {
    var number1 = Math.random() * (m - n + 1);
    number2 = Math.floor(number1);
    return number2 + n;
}  

用相同的思想,可以将Math.random()的结果放缩到任意区间,当然也包括负数的情况。

3. 示例

3.1 生成随机数

我们首先来看下Math.random()的作用和随机生成一个任意区间内的整数的情况,以下代码的执行结果如图1所示。

 <script>
    /* 生成[n, m]范围内的随机整数 */
    function getRandomIntSection(n, m) {
        var number1 = Math.random() * (m - n + 1);
        number2 = Math.floor(number1);
        return number2 + n;
    }

    /* Math.random() */
    console.log("Math.random():");
    var value1 = Math.random();
    var value2 = Math.random();
    var value3 = Math.random();
    console.log(value1 + "n" + value2 + "n" + value3 + "nn");

    /* 生成[40, 50]之间的随机整数 */
    console.log("getRandomIntSection(40, 50):");
    value1 = getRandomIntSection(40, 50);
    value2 = getRandomIntSection(40, 50);
    value3 = getRandomIntSection(40, 50);
    console.log(value1 + "n" + value2 + "n" + value3 + "n");
</script>  

图1 随机数的生成

3.2 随机数的分布

官方文档中说Math.random()的结果要大致符合均匀分布,我们现在就通过一个实例来看一看。在该例子中,我们先随机生成1亿个 [1, 10] 范围内的整数,再计算每个数出现的比例。

 <script>
    /* 生成[n, m]范围内的随机整数 */
    function getRandomIntSection(n, m) {
        var number1 = Math.random() * (m - n + 1);
        number2 = Math.floor(number1);
        return number2 + n;
    }

    /* 存放结果的数组有11个元素,但我们只使用后面10个,即下标从1到10的那几个 */
    var counts = 100000000;
    var results = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

    /* 生成counts个随机数,每生成一个都将结果数组中对应下标的元素值加1 */
    for(var i = 0; i < counts; ++i) {
        var number = getRandomIntSection(1, 10);
        results[number]++;
    }

    /* 打印每个数出现的比例 */
    for(i = 1; i <= 10; ++i) {
        var percent = results[i] / counts * 100;
        console.log(i + ": " + percent + "%n");
    }
</script>  

以上代码的执行结果如图2所示,正是因为Math.random()符合均匀分布而我们自定义的随机数函数又是建立在Math.random()上的,所以我们的随机数函数生成的随机数也是均匀分布的。

图2 随机数的分布情况

(完)

文章来源:智云一二三科技

文章标题:JavaScript用Math.random()生成随机数

文章地址:https://www.zhihuclub.com/187508.shtml

关于作者: 智云科技

热门文章

发表回复

您的电子邮箱地址不会被公开。

网站地图