(新)控制随机数概率: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

Js 控制随机数概率的更多相关文章

  1. js 控制随机数生成概率

    基本思路:把Math.random()生成的数看着百分比,然后定义每个整数值取值范围. 'use strict'; export default class GL { /** * 构造函数 * @pa ...

  2. js控制随机数生成概率代码实例

    基本思路:把Math.random()js随机数生成的数看着百分比,然后定义每个整数值取值范围. 具体内容如下,供大家参考 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  3. 真的了解js生成随机数吗

    由js生成一切随机数的基础都是Math.random()这个方法,这个方法比较特别,生成的随机数落在的区间是[0,1),进行一次操作的话,js只能生成一个类似于[n,m)这样,左闭右开的区间.所以当有 ...

  4. js控制Bootstrap 模态框(Modal)插件

    js控制Bootstrap 模态框(Modal)插件 http://www.cnblogs.com/zzjeny/p/5564400.html

  5. js控制文本框只能输入中文、英文、数字与指定特殊符号.

    先在'' 里输入 onkeyup="value=value.replace(/[^\X]/g,'')" 然后在(/[\X]/g,'')里的 X换成你想输入的代码就可以了, 中文u4 ...

  6. JS控制flash的方法

    JS控制flash的一些方法:Play() ---------------------------------------- 播放动画 StopPlay()---------------------- ...

  7. js 控制Div循环显示 非插件版

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. JS常用正则表达式和JS控制输入框输入限制(数字、汉字、字符)

    验证数字:^[0-9]*$验证n位的数字:^\d{n}$验证至少n位数字:^\d{n,}$验证m-n位的数字:^\d{m,n}$验证零和非零开头的数字:^(0|[1-9][0-9]*)$验证有两位小数 ...

  9. JS 控制CSS样式表

    JS控制CSS所使用的方法: <style> .rule{ display: none; } </style> 你想要改变把他的display属性由none改为inline.  ...

随机推荐

  1. Canal学习笔记(客户端)

    前言 最近公司用到Canal来做从MySQL到Tidb的数据同步,用到HA模式Canal,记录一下HA模式的工作原理. Canal的架构模式 Canal是利用binlog日志来做数据同步,canal伪 ...

  2. 超实用的 Nginx 极简教程,覆盖了常用场景

    概述 什么是 Nginx? Nginx (engine x) 是一款轻量级的 Web 服务器 .反向代理服务器及电子邮件(IMAP/POP3)代理服务器. 什么是反向代理? 反向代理(Reverse ...

  3. 第76节:Java中的基础知识

    第76节:Java中的基础知识 设置环境,安装操作系统,安装备份,就是镜像,jdk配置环境,eclipse下载解压即可使用,下载tomcat 折佣动态代理解决网站的字符集编码问题 使用request. ...

  4. Web Components(续)

    概述 之前我们介绍了Web Components的基本概念,现在我们给出一个使用Web Components的实例代码,并且对组件化进行一些思考.记录下来,供以后开发时参考,相信对其他人也有用. 实例 ...

  5. MySQL数据库的锁机制

    在并发访问情况下,很有可能出现不可重复读等等读现象.为了更好的应对高并发,封锁.时间戳.乐观并发控制(乐观锁).悲观并发控制(悲观锁)都是并发控制采用的主要技术方式. 锁分类 ①.按操作划分:DML锁 ...

  6. ubuntu 16.04 下安装动态链接库方法

    一般先使用ldd 来查看该应用程序缺少什么东西,然后,再根据sudo apt install XXX 去安装相应的动态库. 假如没有对应的库,可以使用: sudo ln -s /usr/lib/lib ...

  7. SpringBoot整合Mybatis完整版

    喜欢的朋友可以关注下,粉丝也缺. 自从Spring推出Boot,Cloud系列之后,一度成为热门的框架,现在大部分的招聘要求都要有相关的开发经验,借此我在这里就给大家分享一下如何玩转SpringBoo ...

  8. express脚手架的安装,以及ejs的语法

    express 1.建一个项目  npm init -y 初始化一下项目 2.cnpm install express -S 安装express模块 3.cnpm init 安装依赖 !ejs模板是后 ...

  9. 避免jquery的click多次绑定方法

    $("#xxx").click(function(){}) 这样只是会在原click方法中继续添加新方法: 当然解决办法是解绑: $("#xxx").unbin ...

  10. 【shiro】(5)---基于Shiro的权限管理

    基于Shiro的权限管理项目搭建 前面写了四篇有关权限的文章,算是这篇文章的铺垫了.这篇文章采用 开发环境           JDK1.8          Eclipse          Mav ...