如何在随机数生成时指定概率:轮盘赌算法的简单应用

如何在随机数生成时指定概率:轮盘赌算法的简单应用

实例

有一个数组[1,2,3,4,5]随机选一个数,使得选到1的概率为1/3,选到2的概率为4/15,选到3的概率为1/5,选到4的概率为2/15,选到5的概率为1/15。

解决方案

这里可以采用轮盘赌算法处理这种随机选取的情况。即先定义一个权重数组,权重数组中的每个值对应着原数组中的每个值的选择概率。然后通过随机数来选择权重数组中的一个值,最后根据权重数组中的值的索引来从原数组中选择对应的值。
轮盘赌算法的基本思想是将每个元素的概率分配在一个轮盘上,然后生成一个随机数,按照随机数在轮盘上的位置来选择一个元素。这样每个元素被选中的概率就等于其在轮盘上占用的比例。
轮盘赌算法是采用将生成的随机数与累计概率比较进行选择的。在代码实现中有一下两种写法。

利用选中概率计算

let array = [1,2,3,4,5];
let weight = [1/3, 4/15, 1/5, 2/15, 1/15];
let totalWeight = weight.reduce((prev, cur) => prev + cur);

function random_item(array, weight) {
    let random_num = Math.random() * totalWeight;
    let weight_sum = 0;
    for (let i = 0; i < array.length; i++) {
        weight_sum += weight[i];
        weight_sum = +weight_sum.toFixed(2);
        if (random_num < weight_sum) {
            return array[i];
        }
    }
}

利用累计概率计算

let array = [1,2,3,4,5];
let weight = [1/3, 4/15, 1/5, 2/15, 1/15];
let cum_weight = weight.map((w, i) => weight.slice(0, i+1).reduce((a, b) => a + b));

function random_item(array, cum_weight) {
    let random_num = Math.random() * cum_weight[array.length-1];
    for (let i = 0; i < array.length; i++) {
        if (random_num < cum_weight[i]) {
            return array[i];
        }
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值