基本思路:把Math.random()生成的数看着百分比,然后定义每个整数值取值范围。

'use strict';

class GL {
/**
* 构造函数
* @param {object} opt
* @param {number} opt.min 最小整数值
* @param {number} opt.max 最大整数值
* @param {Map} opt.fenpei 自定义概率
*/
constructor({ min, max, fenpei = new Map() }) {
this.min = min;
this.max = max;
this.fenpei = fenpei;
} /**
* 可分配百分比
*/
get baifenbi() {
return (1 - this.peizhi) / (this.max - this.min - this.fenpei.size);
} /**
* 匹配百分比
*/
get peizhi() {
let result = 0;
for (let i of this.fenpei.values()) {
if (0 < i && i < 1) result += i;
}
return result;
} /**
* 随机数
* @returns {number} [min,max)
*/
random() {
let t = 0, r = Math.random();
for (let i = this.min; i < this.max; i++) {
this.fenpei.has(i) ? t += this.fenpei.get(i) : t += this.baifenbi;
if (t > r) return i;
}
return null;
}
} export default GL;
//module.exports = GL;

// 引用gl

import GL from './src/index.js';
//const GL = require('./src'); // 随机生成 1 ~ 8 之间的数(不包含8)
let gl = new GL({
min: 1,
max: 8,
fenpei: new Map([
[1, 0.1], // 1 生成概率为 10%
[2, 0.5], // 2 生成概率为 50%
[5, 0.2], // 5 生成概率为 20%
])
}); {
// 循环10000次看下概率分配情况
let map = {};
for (let i = 0; i < 10000; i++) {
let num = gl.random();
typeof map[num] !=='undefined' ? map[num] += 1 : map[num] = 0 ;
} for (let key in map) {
console.log(`${key} = ${map[key] / 10000}`);
}
}

百度网盘:

链接:https://pan.baidu.com/s/1Q8Ww3siWq9xHQ5KPPz_azQ
提取码:oyzr
复制这段内容后打开百度网盘手机App,操作更方便哦

js 控制随机数生成概率的更多相关文章

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

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

  2. Js 控制随机数概率

    如: 取 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 ...

  3. SlimerJS – Web开发人员可编写 JS 控制的浏览器

    SlimerJS 是一个提供给 Web 开发人员,可通过脚本编程控制的浏览器.它可以让你使用 Javascript 脚本操纵一个网页:打开一个网页,点击链接,修改的内容等,这对于做功能测试,页面自动机 ...

  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. js实现 页面加载 完成 后顺序 执行

    function addLoadEvent(func){ var oldonLoad = window.onload; if(typeof window.onload != 'function'){ ...

  2. 从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器

    从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器 之前时间一直在使用Caliburn.Micro这种应用了MVVM模式的WPF框架做开发,是时候总结一下了. Calibu ...

  3. Flannel工作原理

    flanneld程序启动会有一个参数叫做-etcd-prefix和-iface.前者是指定flanneld程序使用etcd的哪个节点来存储数据,-face是指定flanneld使用网络是使用宿主机哪个 ...

  4. Java 泛型完全解读

    对于泛型的使用我想大家都非常熟悉,但是对于类型擦除,边界拓展等细节问题,可能不是很清楚,所以本文会重点讲解一下:另外对泛型的了解其实可以看出,一个语言特性的产生逻辑,这对我们平时的开发也是非常有帮助的 ...

  5. docker(5):数据的管理

    Docker的volume卷 为了能持久话保存和共享容器的数据. 使用docker volume卷的两种方式 1:数据卷 2:数据卷容器 1:数据卷 数据卷:数据卷会绕过docker 的ufs 直接写 ...

  6. C# 操作Word目录——生成、删除目录

    目录,是指书籍.文档正文前所载的目次,将主要内容以一定次第顺序编排,起指导阅读.检索内容的作用.在Word中生成目录前,需要设置文档相应文字或者段落的大纲级别,根据设定的大纲级别可创建文档的交互式大纲 ...

  7. GitLab11.3.9 使用 Crowd3.3.2 的帐号实现 SSO 单点登录,以及GitLab配置腾讯企业邮箱

    GitLab11.3.9 的安装方法: 点击查看.   Crowd3.3.2 的安装方法:点击查看.   需要先在 Crowd 创建应用程序,参考 <Docker 创建 Crowd3.3.2 以 ...

  8. 关于项目中ajax 操作 原生项目遇到的问题

    单选框动态赋值 $('input[name=pszt][value='+val+']').attr("checked",true); 置顶的几种方式 window.scrollTo ...

  9. Java面向对象概述及三大特征(封装,继承和多态)

    一.面向对象思想 Java是面向对象的高级语言,对于Java语言来说,万事万物皆对象! 它的基本思想是使用类,对象,继承,封装,消息等基本概念进行程序设计.面向对象程序的最小单元是类,类代表了客观世界 ...

  10. Git实际使用

      初始化 git init  — cd到目录,初始化仓库 git init name — 新建文件,并初始化仓库 .gitignore    — 忽略文件(https://github.com/gi ...