python简单的加权随机数

本文介绍了如何在Python中利用权重列表生成加权随机数。通过创建权重列表并根据权重值构造链表,可以实现对不同资源的加权随机访问。权重越大,被随机选中的概率越高。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

随机访问list资源,但资源访问有一个权重。建立wightlist 权重列表,表示对应的资源编号的权重值,依据权重值生成重读个资源,加入到wlatch 链表中,然后就可用依据random随机生成数字来实现加权的随机,权重越大,则资源个数越多,则随机访问到的概率也就变大。

示例如下:


#coding=utf8

import random
import time

list = {
    1: "test1",
    2: "test2",
    3: "test3",
    4: "test4",
    5: "test5"
}

wlatch = []
num = 0
wightlist = {1: 2, 2: 1, 3: 3, 4: 1, 5: 3}
for i in wightlist:
    for x in range(wightlist[i]):
        wlatch.append(i)
        num += 1

print wightlist
print num
print wlatch
while 1:
   radnum=random.randint(0,num-1)
   print list[wlatch[radnum]]
   time.sleep(1)

输出:

{1: 2, 2: 1, 3: 3, 4: 1, 5: 3}
10
[1, 1, 2, 3, 3, 3, 4, 5, 5, 5]
test3
test3
test5
test5
test2
test1
### Python中实现加权随机选择 在Python中,可以采用不同方式来实现加权随机选择。一种常见的方式是通过计算累积权重并利用`random.uniform()`函数生成一个介于0和总权重之间的随机数来进行选择[^1]。 ```python import random def weighted_random_choice(choices): # 计算累积权重 cum_weights = [] cum_weight = 0 for _, weight in choices: cum_weight += weight cum_weights.append(cum_weight) # 获取总的权重值用于后续比较 total_cum_weight = cum_weight # 生成一个位于0至总权重间的随机浮点数 random_num = random.uniform(0, total_cum_weight) # 查找第一个累加权重超过此随机数值的位置即为目标选项 for (choice, _), cum_weight in zip(choices, cum_weights): if random_num < cum_weight: return choice # 若未找到匹配项则返回None作为默认处理 return None ``` 另一种更简洁的方法是在较新的Python版本(3.2及以上)里使用内置库`itertools.accumulate`配合二分查找算法加快定位过程[^4]: ```python from itertools import accumulate import bisect import random def weighted_random_pick(options, weights): cumulative_weights = list(accumulate(weights)) rand_val = random.random() * cumulative_weights[-1] index_picked = bisect.bisect_left(cumulative_weights, rand_val) return options[index_picked] if __name__ == '__main__': items = ['apple', 'banana', 'cherry'] item_weights = [5, 2, 3] picked_item = weighted_random_pick(items, item_weights) print(f"Picked Item: {picked_item}") ``` 上述两种方法均能有效地完成基于给定权重的概率分布下的元素选取操作。前者适用于所有支持的Python环境,而后者借助了新特性使得代码更加紧凑高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值