赌轮盘(赌轮盘)的意义
从大的概率分布来说,赌轮盘是按照既定的概率分布进行抽样,其本质可以用np.choice的方式来实现,当然,绝大数情况下,我们都是自己去写的,因此,本文给出两种形式赌轮盘取数据的方式。
输入值:一行数值,
输出值:根据这行数值概率分布而采样得到的index序列。
代码实现
import numpy as np
"""
名称:赌轮盘选择一对
"""
def roulette_get_oneindex(F, probability_sum):
#赌轮盘玩法,选择出一个
rand = random.uniform(0, 1) # 在0-1之间随机一个浮点数
for k in range(len(F)):
if k == 0:
# 如果rand值小于概率累积分布数组中的第一个值,则取第一个
if rand < probability_sum[k]:
return k
else:
if (rand > probability_sum[k - 1]) and (rand < probability_sum[k]):
return k
def rouletter():
# 概率累积分布
probability_sum = np.cumsum(probability)
print(probability_sum)
index_result=[]
for i in range(100):
# 赌轮盘选择出1个
oneindex = roulette_get_oneindex(F, probability_sum)
index_result.append(oneindex)
return (np.array(index_result))
if __name__=="__main__":
F=np.random.random(size=10)
F[9]=3
print(F)
#选择和交叉操作
# 构建累积概率分布
probability = F / np.sum(F)
print(probability)
# 方式一:自己实现轮盘赌
rouletter_result=rouletter()
print(rouletter_result)
# 方式二:采用np.choice
sample_result=np.random.choice(a=np.arange(F.shape[0]),size=100,replace=True,p=probability)
print(sample_result)
结果分析
从结果分布,发现9出现的次数是最多的,两者都是,说明本文的两种轮盘赌方法都是有效的,而且方法2的简洁性更强,足见numpy的优势。
后记
作此篇,纪念2016年自己硕士毕业时也运用了这个方法,当时是用C#和JAVA实现的,客观而言,简洁性不足,也未深究其中的深层次内涵,而今,采用Python实现,简洁性大大提升。