(新)控制随机数概率: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. Vue实现懒加载的基本思路

    懒加载是前端开发者的基本功之一.实现懒加载肯定是要直接操作DOM的,这个没得跑,但我们可以想办法让流程尽可能优雅些. 基本结构 父组件是列表容器,子组件是列表中的项,如卡片.帖子等,承载图片的DOM对 ...

  2. Git使用详细教程(2):配置用户名和邮箱

    首先,说下最常用的设置用户名和邮箱的命令 git config --global user.name 'xxx' //设置用户名 git config --global user.email 'xxx ...

  3. 第一节:ASP.NET开发环境配置

    第一节:ASP.NET开发环境配置 什么是ASP.NET,学这个可以做什么,学习这些有什么内容? ASP.NET是微软公司推出的WEB开发技术. 2002年,推出第一个版本,先后推出ASP.NET2. ...

  4. 微信小程序高级基础

    微信小程序高级基础 微信小程序的注册和服务器配置: 小程序是什么呢?小程序是一种不需要下载安装就可以使用的应用,它实现了应用"触手可及"的梦想,用户扫一扫或者搜一下就可以打开应用, ...

  5. ES6常用特性总览

    以前看过一遍es6,今天面试时被问到了一个很简单的es6特性,竟然没回答上来,特来重温一下es6,做个总结性笔记. 一.什么是es6 es6是新版本JavaScript语言的标准,在2015年6月发布 ...

  6. springBoot(11)---整合Active消息队列

    Springboot整合Active消息队列 简单理解: Active是Apache公司旗下的一个消息总线,ActiveMQ是一个开源兼容Java Message Service(JMS) 面向消息的 ...

  7. JDK,JRE,JVM,JMM关系与区别

    JVM: Java Virtual Machine, 将java文件编译成class文件并运行class文件的软件 JRE:Java  Runtime  Enviromental,包含了JVM和Jav ...

  8. 通过Microsoft Learn进行学习以提升技能

    通过 Microsoft Learn,可以免费而且轻松有趣地学习 Microsoft 技术. Microsoft Learn的与众不同 借助 Microsoft Learn,任何人都能按自己的学习计划 ...

  9. 详解Maven用户的配置settings.xml

    Maven用户设置 作者其他技术文章 1)Oracle性能优化之查询语句通用原则 2)Redis常用命令 3) SpringCloud入门之常用的配置文件 application.yml和 boots ...

  10. Python3获取拉勾网招聘信息

    为了了解跟python数据分析有关行业的信息,大概地了解一下对这个行业的要求以及薪资状况,我决定从网上获取信息并进行分析.既然想要分析就必须要有数据,于是我选择了拉勾,冒着危险深入内部,从他们那里得到 ...