js实现按权重取随机分布(生成多项分布算法)

本文探讨了如何在JavaScript中按权重实现随机分布,特别是针对员工、主管和领导不同概率选取的问题。文中介绍了一种非最佳方法,即通过复制多份实现,但这种方法空间复杂度较高。接着详细阐述了多项分布的优化算法,采用二分法查找,达到o(logn)的时间复杂度和o(n)的空间复杂度。实验结果显示,该算法与理论值接近,具备较高的准确性。
摘要由CSDN通过智能技术生成

问题描述

在使用Mock.js过程中发现随机取值可能不符合实际,例如:
如何实现按不同概率选取 员工80%,主管16%,领导4%
中间发现了多项分布算法及其部分资料,也和小猫nebulaqiqi探(mo)讨(yu)了下。

一种可能的方法(非最佳)

通过类似于北京摇号平台算法,复制多份实现多个编码对应一个有效号。虽然能实现功能,但是消耗大量的内存。算法复杂度为o(1),空间复杂度为o(n*weight)
摇号描述

const list = [{
    v: '员工', p: 80 }, {
    v: '主管', p: 16 }, {
    v: '领导', p: 4 }]
let result = []
for (let i = 0; i < list.length; i++) {
   
result = result.concat(new Array(list[i].p).fill(list[i].v))
}
return Random.pick(result)

多项分布方法

简单的使用二分法查找当前值所在的区域,得到最后区域的值。即算法复杂度为o(logn),空间复杂度为o(n),可参见R语言多项分布

预览效果

在这里插入图片描述
在这里插入图片描述
发现和理论值还是比较接近的,算法准确。

> n*p[1]  ##巴萨获胜场数的理论值
[1] 3988.764
> n*p[2]  ##巴萨打平场数的理论值
[1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值