欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Js 控制随机数概率

程序员文章站 2022-03-24 13:03:07
如: 取 1~10 之间的随机数,那么他们的取值范围是: 整数 区间 概率 1 [0,1) 0.1 2 [1,2) 0.1 3 [2,3) 0.1 4 [3,4) 0.1 5 [4,5) 0.1 6 [5,6) 0.1 7 [6,7) 0.1 8 [7,8) 0.1 9 [8,9) 0.1 10 [ ......

 

如:

1~10 之间的随机数,那么他们的取值范围是

 

整数

区间

概率

1

[0,1)

0.1

2

[1,2)

0.1

3

[2,3)

0.1

4

[3,4)

0.1

5

[4,5)

0.1

6

[5,6)

0.1

7

[6,7)

0.1

8

[7,8)

0.1

9

[8,9)

0.1

10

[9,10)

0.1

 

如果调整2的概率为0.5,那么1~10之间的随机数取值区间与其它值的概率都会发现变化 如下:

最小取值范围 = 0

最大取值范围 = 最小取值范围  + 概率 * 10(分成10份)

 

整数

区间

概率

1

[0,0.55)

≈ 0.055

2

[0.55,5)

0.5

3

[5,5.55)

≈ 0.055

4

...

≈ 0.055

5

...

≈ 0.055

6

...

≈ 0.055

7

...

≈ 0.055

8

...

≈ 0.055

9

...

≈ 0.055

10

...

≈ 0.055

 

 

然后调用随机函数生成1~10之间的随机数,如果生成的随机数在某个整数的取值范围内,那么就输出当前整数。

 

/*
 * @author: 破壳而出的蝌蚪
 * @博客:https://www.cnblogs.com/whnba/ 
 * @date: 2019-01-03 15:03:33 
 * @last modified by: mikey.zhaopeng
 * @last modified time: 2019-01-03 15:04:17
 */

'use strict';

class glrandom {
    /**
     * 构造函数
     * @param {number} min  最小整数值
     * @param {number} max  最大整数值
     * @param {map} percentage 概率数 [值,百分比]
     */
    constructor(min, max, percentage = new map()) {
        this.min = math.trunc(min);
        this.max = math.trunc(max);
        this.math_range = 100;  // 分成100份
        this.percentage = percentage;
    }

    get percentage() {
        if (!this._percentage) {
            this._percentage = new map();
        }
        return this._percentage;
    }

    /**
     * 分配比例
     * @param {map} map 设置 值-百分比
     */
    set percentage(map) {
        let result = array.from(map.values()).reduce((p, v, a) => {
            return p - v;
        }, 1);
        for (let i = this.min; i < this.max; i++) {
            if (map.has(i)) {
                this.percentage.set(i, map.get(i));
            } else {
                this.percentage.set(i, result / (this.max - this.min - map.size));
            }
        }
    }

    /**
     * 根据比例生成取值范围
     */
    range() {
        let [start, random, keys] = [0, this.math_range, array.from(this.percentage.keys())];
        for (let i = 0; i < keys.length; i++) {
            let temp = this.percentage.get(keys[i]);
            this.percentage.set(keys[i], [start, start += temp * random]);
        }
    }

    /**
     * 生成随机数
     */
    create() {
        let num = math.random() * this.math_range;
        for (let data of this.percentage.entries()) {
            if (num >= data[1][0] && num < data[1][1]) {
                return data[0];
            }
        }
        return null;
    }
}

 

 

// 样本
{
    // 随机数范围 :40~900 
    let random = new glrandom(40, 100);

    // 调整概率
    random.percentage = new map([
        [41,0.2],   // 调整值为41的数值,概率为20%  
        [46,0.5],   // 调整值为46的数值,概率为50%  
        [90,0.05]   // 调整值为90的数值,概率为5%  
    ]);

    // 生成值区间
    random.range();

    // 生成概率随机数
    console.log(random.create());
}

百度经验地址:https://jingyan.baidu.com/article/5553fa827bfe7d65a239341d.html

源码地址:https://pan.baidu.com/s/1ieohaye34naha8jfhhfzaw