加权随机算法的python实现
16lz
2021-01-22
1 随机抽奖
本次运行环境为:
win7
jupyter notebook
python 3.6
1.1 随机抽取一个元素
用 random.choice()
来实现随机抽取一个元素。
from random import choiceimport randomimport pandas as pdname = ['张三', '李四', '王五', '小明', '小郑', '梅西', 'C罗', '内少']random_name = choice(name)random_name
1.2 随机抽取多个元素
可以考虑用 random.sample()
来随机抽取多个元素。
# 从name中随机选择3个元素slice_sample = random.sample(name, 3)slice_sample
1.3 考虑权重后随机抽取一个元素
如果是不同的成员有不同的权重,比如本次抽奖,在赞赏的同时有评论的人员,赋予的权重要求稍微高一些。可以自定义一个函数,用来考虑权重后随机抽取一个元素。
# weight_data 的数据类型为 dictdef random_weight(weight_data): total = sum(weight_data.values()) # 权重求和 ra = random.uniform(0, total) # 在0与权重和之前获取一个随机数 curr_sum = 0 ret = None# keys = weight_data.iterkeys() # 使用Python2.x中的iterkeys keys = weight_data.keys() # 使用Python3.x中的keys for k in keys: curr_sum += weight_data[k] # 在遍历中,累加当前权重值 if ra <= curr_sum: # 当随机数<=当前权重和时,返回权重key ret = k break return ret# 用Pandas从excel中读取数据df = pd.read_excel('choujiang.xlsx')# 将数据进行整理df_data = df[['name', 'weight']].set_index('name')# 根据上面的上述,获取dict类型的数据data = df_data.to_dict()['weight']random_weight(data)
1.4 考虑权重后,随机获取多个元素
最终,本次需要在考虑权重后,随机获取多个元素(N个),并且不能重复,可以在上个函数的基础上,再添加一个自定义函数,来一次性加权随机抽取多个元素。
def choujiang(data, N):# N = 6 results = [] i = 0 while i < N: m = random_weight(data) if m in results: continue results.append(m) i = i+1 return resultschoujiang(data,3)
---------------- End ----------------
点击前往【项目实战】
世界杯系列 | 福布斯系列 | 求职系列
知识星球
我的知识星球【Python数据之道成长圈】已开通,想加入的同学,请回复数字 “2” 了解详情。
更多相关文章
- Python办公自动化|光速对比并提取两份Word/Excel中的不同元素
- 动画: 快速排序 | 如何求第 K 大元素?
- php获取数组中最后一个元素的方法
- php实现获取数组中相同/不相同的元素
- 为什么推荐使用for-each而不是for循环遍历元素?
- 群统计v0.9: 特殊权重票,现场活动投票利器
- Selenium3自动化测试【12】元素定位认知
- Jquery对选取到的元素显示指定的长度,对于的字符串用“...”显示
- jQuery编程基础精华02(属性、表单过滤器,元素的each,表单选择器,子元