查看原文
其他

加权随机算法的python实现

我是阳哥 Python数据之道 2022-09-04

1 随机抽奖

本次运行环境为:

  • win7

  • jupyter notebook

  • python 3.6

1.1 随机抽取一个元素

用 random.choice() 来实现随机抽取一个元素。

  1. from random import choice

  2. import random

  3. import pandas as pd

  4. name = ['张三', '李四', '王五', '小明', '小郑', '梅西', 'C罗', '内少']

  5. random_name = choice(name)

  6. random_name

1.2 随机抽取多个元素

可以考虑用 random.sample() 来随机抽取多个元素。

  1. # 从name中随机选择3个元素

  2. slice_sample = random.sample(name, 3)

  3. slice_sample

1.3 考虑权重后随机抽取一个元素

如果是不同的成员有不同的权重,比如本次抽奖,在赞赏的同时有评论的人员,赋予的权重要求稍微高一些。可以自定义一个函数,用来考虑权重后随机抽取一个元素。

  1. # weight_data 的数据类型为 dict

  2. def random_weight(weight_data):

  3.    total = sum(weight_data.values())    # 权重求和

  4.    ra = random.uniform(0, total)   # 在0与权重和之前获取一个随机数

  5.    curr_sum = 0

  6.    ret = None

  7. #     keys = weight_data.iterkeys()    # 使用Python2.x中的iterkeys

  8.    keys = weight_data.keys()        # 使用Python3.x中的keys

  9.    for k in keys:

  10.        curr_sum += weight_data[k]             # 在遍历中,累加当前权重值

  11.        if ra <= curr_sum:          # 当随机数<=当前权重和时,返回权重key

  12.            ret = k

  13.            break

  14.    return ret

  15. # 用Pandas从excel中读取数据

  16. df = pd.read_excel('choujiang.xlsx')

  17. # 将数据进行整理

  18. df_data = df[['name', 'weight']].set_index('name')

  19. # 根据上面的上述,获取dict类型的数据

  20. data = df_data.to_dict()['weight']

  21. random_weight(data)

1.4 考虑权重后,随机获取多个元素

最终,本次需要在考虑权重后,随机获取多个元素(N个),并且不能重复,可以在上个函数的基础上,再添加一个自定义函数,来一次性加权随机抽取多个元素。

  1. def choujiang(data, N):

  2. #     N = 6

  3.    results = []

  4.    i = 0

  5.    while i < N:

  6.        m = random_weight(data)

  7.        if m in results:

  8.            continue

  9.        results.append(m)

  10.        i = i+1

  11.    return results

  12. choujiang(data,3)


---------------- End ----------------


点击前往【项目实战】

世界杯系列 | 福布斯系列 | 求职系列


知识星球

我的知识星球【Python数据之道成长圈】已开通,想加入的同学,请回复数字 “2” 了解详情。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存