问题描述
在使用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