(新)控制隨機數概率:https://www.cnblogs.com/whnba/p/10565045.html 算法精簡了一下
如:
取 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