赌轮盘代码 20210124

赌轮盘(赌轮盘)的意义

从大的概率分布来说,赌轮盘是按照既定的概率分布进行抽样,其本质可以用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实现,简洁性大大提升。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页