资讯专栏INFORMATION COLUMN

生成随机均衡整数

hidogs / 792人阅读

摘要:使用来生成随机数在日常操作中是普遍并且是简单的。如下上述代码的作用是生成的随机数。但是,如果把随机数改成随机整数。

使用 Math.random 来生成随机数在日常操作中是普遍并且是简单的。如下:

let rnd = Math.random() * 10; 

上述代码的作用是生成 0~10 的随机数。

那么,这些随机数是出现的概率是均衡的吗?
笔者没办法直接回答这个问题。因为生成的随机数个数理论上是一个无穷大的数集,不过,可以按数值大小范围来估算数值的分布是否平均:

let bucket = new Array(10).fill(0); 
let res = new Array(500000); 
// 做50万次随机数
for(let i = 0; i < 500000; ++i) {
    res[i] = Math.random() * 10; 
    // 数值大小规类
    let num = res[i]; 
    for(let i = 0; i < 10; ++i) {
        if(num >= i * .1 && num < (i + 1) * .1) {
            ++bucket[i]; 
        }
    }
}

bucket.forEach(
    (count, index) => {
        console.log(index * .1 + "~" + (index + 1) * .1 + "的概率:" + count / 500000)
    }
)

以下是一次输出结果:

0~0.1的概率:0.010244

0.1~0.2的概率:0.009868

0.2~0.3的概率:0.009744

0.3~0.4的概率:0.010024

0.4~0.5的概率:0.009818

0.5~0.6的概率:0.009814

0.6~0.7的概率:0.010048

0.7~0.8的概率:0.009834

0.8~0.9的概率:0.010154

0.9~1的概率:0.009988

结果显示 Math.random() * 10 生成的数值分布是比较均衡的。

但是,如果把「随机数」改成「随机整数」。代码改成:

let rnd = Math.round(Math.random() * 10); 

上面代码是生成 0~10 的随机整数。

那么,这些随机整数是出现的概率是均衡的吗?

笔者直观上觉得是随机的,但是实际情况并不是!测试代码如下:

let res = new Array(11).fill(0); 
// 做一万次随机数
for(let i = 0; i < 500000; ++i) {
    ++res[Math.round(Math.random() * 10)]; 
}

res.forEach((count, index) => console.log(index + "的概率:" + count / 500000))

以下是一次结果:

0的概率:0.050028

1的概率:0.09957

2的概率:0.100616

3的概率:0.099684

4的概率:0.100672

5的概率:0.099588

6的概率:0.100446

7的概率:0.100276

8的概率:0.099664

9的概率:0.099628

10的概率:0.049828

不难发现,010 的概率是其它数值的一半左右,而其它数值的概率相差无几。

Math.round 方法是造成「随机整数」不均衡的原因

Math.round/Math.ceil/Math.floor 这三个函数作用是使一定范围内的实数转换成同一个整数。以 Math.round 为例如下:

从上图可以直观地看到,头尾两数(0&10)的取值范围是其它整数的一半!

生成随机均衡整数的一种方案
其实,只需要保证取值范围的长度一致即可以实现随机均衡整数。以下是笔者实现的一种方案:

let res = new Array(11).fill(0); 
// 做一万次随机数
for(let i = 0; i < 500000; ++i) {
    ++res[Math.floor(Math.random() * 11)]; 
}

res.forEach((count, index) => console.log(index + "的概率:" + count / 500000))

以下是一次输出结果:

0的概率:0.090828

1的概率:0.090988

2的概率:0.09048

3的概率:0.08958

4的概率:0.091516

5的概率:0.090826

6的概率:0.09112

7的概率:0.091668

8的概率:0.090918

9的概率:0.090626

10的概率:0.09145

从结果上看分布是均衡的。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/90781.html

相关文章

  • Dubbo 源码分析 - 集群容错之 LoadBalance

    摘要:即服务提供者目前正在处理的请求数一个请求对应一条连接最少,表明该服务提供者效率高,单位时间内可处理更多的请求。此时应优先将请求分配给该服务提供者。初始情况下,所有服务提供者活跃数均为。 1.简介 LoadBalance 中文意思为负载均衡,它的职责是将网络请求,或者其他形式的负载均摊到不同的机器上。避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况。通过负载均衡,可以让每台服务...

    ybak 评论0 收藏0
  • JS生成概率相等的随机数(4种类型)

    摘要:生成随机数的方案网上有很多,但是在验证概率的时候却发现不相同先把这种类型的随机正整数生成方式贴出来。 生成随机数的方案网上有很多,但是在验证概率的时候却发现不相同先把这4种类型的随机正整数生成方式贴出来。 ①、// 生成 [n,m),包含n但不包含m的正整数: --   parseInt(Math.random()*(m-n)+n) ②、// 生成(n,m],不包含n但包含m的正整数:...

    chadLi 评论0 收藏0
  • NPM酷库:number-random,生成随机数字

    摘要:库就可以方便地生成指定范围的随机数字,并且支持指定生成整数或是小数。 NPM酷库,每天两分钟,了解一个流行NPM库。 昨天,我们了解到 string-random 库可以用来快速生成指定格式的随机字符串,今天我们继续学习如何生成随机的数字。 其实只需要 Math.random()就可以生成一个随机数字,但是这个数字大小是0~1,如果我们需要生成一个指定范围的随机数字,那么就需要进一步的...

    wind5o 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<