吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2354|回复: 4
收起左侧

[Python 转载] 自学python-6 摸球游戏2 (填坑 python-5)

[复制链接]
se6cxpp 发表于 2021-7-29 13:08
本帖最后由 se6cxpp 于 2021-7-29 13:18 编辑

在之前的帖子里    https://www.52pojie.cn/forum.php ... d=1411801&ctid=2402     对一个街头游戏进行了描述:
意思是 箱子里有三种颜色的球各8个,不管抽的次数,只管抽的总数,要12个球,如果这12个球里的颜色按照7/4/1分布,你就中奖,如果是5/4/3你就输 ,具体的输赢方式见图。
但凡有点数学常识的都知道这是概率问题,没有哪个摊主会傻呵呵的赔钱干买卖。
现对这一算法做简单的剖析


除颜色不一样其他均一样的三种颜色(红R、蓝B、黄Y)的球各8个,放入盲袋中随机抓取12个,抓取次数不限
当出现660组合奖100元(660中不分颜色,只要是其中一个颜色是6个,另一个是6个,最后一个是0个即可),奖励如下
660 奖励100
882 奖励120
750 奖励60
633 奖励5
543 罚扣30
444 奖励5
840 奖励300
831 奖励100
741 奖励40
642 奖励5
651 奖励10
552 奖励5
732 奖励15

思路:

准备容器存放球
[Python] 纯文本查看 复制代码
box=['R','R','R','R','R','R','R','R','B','B','B','B','B','B','B','B','Y','Y','Y','Y','Y','Y','Y','Y']

敲这个列表是不是很麻烦,当然了,这么多元素,还要加上‘ ’。用列表与运算实现吧
[Python] 纯文本查看 复制代码
box_R=['R']*8
box_B=['B']*8
box_Y=['Y']*8
box=box_R+box_B+box_Y
print(box)

当然,这还不够,为了更好的区分出 此R非彼R,我们尝试在后面加上数字用于区分
[Python] 纯文本查看 复制代码
box=[]
for i in range(1,9):
    r='R'+str(i)
    box.append(r)
    b='B'+str(i)
    box.append(b)
    y='Y'+str(i)
    box.append(y)
print(box)

运行结果:
> ['R1', 'B1', 'Y1', 'R2', 'B2', 'Y2', 'R3', 'B3', 'Y3', 'R4', 'B4', 'Y4', 'R5', 'B5', 'Y5', 'R6', 'B6', 'Y6', 'R7', 'B7', 'Y7', 'R8', 'B8', 'Y8']



随机抽取12个
[Python] 纯文本查看 复制代码
import random
box=[]
for i in range(1,9):
    r='R'+str(i)
    box.append(r)
    b='B'+str(i)
    box.append(b)
    y='Y'+str(i)
    box.append(y)        # 生成24个球
result = random.sample(box,12)    # 在24个里随机抽12个
print (result)

运行结果(不唯一):
> ['Y5', 'B5', 'R4', 'Y3', 'Y7', 'Y1', 'Y2', 'R1', 'B1', 'B8', 'R7', 'Y8']


为了更简便,我们采用不带数据编号的列表
[Python] 纯文本查看 复制代码
import random
box_R=['R']*8
box_B=['B']*8
box_Y=['Y']*8
box=box_R+box_B+box_Y
result = random.sample(box,12)    # 在24个里随机抽12个
print (result)

运行结果(不唯一):
>['R', 'Y', 'B', 'B', 'B', 'Y', 'R', 'R', 'R', 'R', 'B', 'B']


计算各颜色球的个数 list.count(obj)
[Python] 纯文本查看 复制代码
import random
box_R=['R']*8
box_B=['B']*8
box_Y=['Y']*8
box=box_R+box_B+box_Y
result = random.sample(box,12)    # 在24个里随机抽12个
print (result)
print(result.count('R'))
print(result.count('B'))
print(result.count('Y'))

运行结果(不唯一):
>['Y', 'Y', 'R', 'R', 'R', 'R', 'B', 'B', 'R', 'R', 'B', 'R']
>7
>3
>2


将计算结果放入列表,并从大到小排序,方便查看
[Python] 纯文本查看 复制代码
import random
box_R=['R']*8
box_B=['B']*8
box_Y=['Y']*8
box=box_R+box_B+box_Y
choise_result = random.sample(box,12)    # 在24个里随机抽12个
print (choise_result)
print(choise_result.count('R'))
print(choise_result.count('B'))
print(choise_result.count('Y'))
final=[choise_result.count('R'),choise_result.count('B'),choise_result.count('Y')] #  将统计结果入列表
final.sort(reverse = True)  #  降序排列
print(final)

运行结果(不唯一):
>['B', 'Y', 'Y', 'Y', 'R', 'R', 'B', 'B', 'B', 'R', 'B', 'Y']
>3
>5
>4
>[5, 4, 3]

简化输出结果
[Python] 纯文本查看 复制代码
import random
box_R=['R']*8
box_B=['B']*8
box_Y=['Y']*8
box=box_R+box_B+box_Y
choise_result = random.sample(box,12)    # 在24个里随机抽12个
final=[choise_result.count('R'),choise_result.count('B'),choise_result.count('Y')] #  将统计结果入列表
final.sort(reverse = True)  #  降序排列
print(final)



判断结果,将结果录入,使用判断语句输出结果,仅做示例
[Python] 纯文本查看 复制代码
import random
box_R=['R']*8
box_B=['B']*8
box_Y=['Y']*8
box=box_R+box_B+box_Y
choise_result = random.sample(box,12)    # 在24个里随机抽12个
final=[choise_result.count('R'),choise_result.count('B'),choise_result.count('Y')] #  将统计结果入列表
final.sort(reverse = True)  #  降序排列
if final==[5,4,3]:
    print('输30')
else:
    print('赢XX')


到这里基本就算ok了,如果还想精进,就要看你所出组合的概率了



计算各种数据出现的概率


通过多次循环,用出现的次数除以循环次数即可算出概率(非数学算法,试验算法)
[Python] 纯文本查看 复制代码
import random
box_R=['R']*8
box_B=['B']*8
box_Y=['Y']*8
box=box_R+box_B+box_Y
choise_times=int(input('输入计算次数(默认为1000):') or 1000) 
j=0
for i in range(choise_times+1):
    choise_result = random.sample(box,12)    # 在24个里随机抽12个
    final=[choise_result.count('R'),choise_result.count('B'),choise_result.count('Y')] #  将统计结果入列表
    final.sort(reverse = True)  #  降序排列
    if final==[5,4,3]:
        j=j+1     
print('出现5/4/3组合的概率大约是:',j/choise_times)      

最后一行犯懒了,没有格式化输出,对小数位数没有约束,但不影响结果,有兴趣的可以用format优化。
运行结果(不唯一):
>输入计算次数(默认为1000):13423
>出现5/4/3组合的概率大约是: 0.49020338225433957

这样算下来,到是能满足5,4,3的组合那其他组合怎么办
我们再提供输入目标列表的代码,替换12行中固定的5/4/3组合
[Python] 纯文本查看 复制代码
import random
box=['R']*8+['B']*8+['Y']*8        #  当然这种写法更加简便暴力。
target_lists=[]                          # 设置空列表承载目标(如:4/6/2组合)
for m in range(3):                   # 通过循环进行目标列表录入
    target=int(input('请依次输入三个数(需要计算的组合):'))
    target_lists.append(target)
target_lists.sort(reverse = True)   #对录入的列表进行降序
print(target_lists)                 # 辅助行,可有可无,就是看看列表能不能生成出来
choise_times=int(input('输入计算次数(默认为1000):') or 1000)                      
j=0
for i in range(choise_times+1):
    choise_result = random.sample(box,12)    # 在24个里随机抽12个
    final=[choise_result.count('R'),choise_result.count('B'),choise_result.count('Y')] #  将统计结果入列表
    final.sort(reverse = True)  #  降序排列
    if final==target_lists:
        j=j+1     
print('出现该该组合的概率大约是:',j/choise_times)     


如果用户输入的三个数的和不是12,即不满足抓出12个球,计算结果就是0,我们尝试做一下数据有效性的判断,规定输入。
[Python] 纯文本查看 复制代码
import random
box=['R']*8+['B']*8+['Y']*8        #  当然这种写法更加简便暴力。
target_lists=[]                          # 设置空列表承载目标(如:4/6/2组合)
for m in range(3):                   # 通过循环进行目标列表录入
    target=int(input('请依次输入三个数(需要计算的组合):'))
    target_lists.append(target)
target_lists.sort(reverse = True)   #对录入的列表进行降序
print(target_lists)                 # 辅助行,可有可无,就是看看列表能不能生成出来
if sum(target_lists)==12:
    choise_times=int(input('输入计算次数(默认为1000):') or 1000)                      
    j=0
    for i in range(choise_times+1):
        choise_result = random.sample(box,12)    # 在24个里随机抽12个
        final=[choise_result.count('R'),choise_result.count('B'),choise_result.count('Y')] #  将统计结果入列表
        final.sort(reverse = True)  #  降序排列
        if final==target_lists:
            j=j+1     
    print('出现该组合的概率大约是:',j/choise_times)    
else:
    print('输入的目标组合不符合要求')    

运行结果(不唯一):
>请依次输入三个数(需要计算的组合):8
>请依次输入三个数(需要计算的组合):3
>请依次输入三个数(需要计算的组合):1
>[8, 3, 1]>输入计算次数(默认为1000):
>出现该该组合的概率大约是: 0.001

如果用户输入 9、1、2 虽然满足和是12,但又不满足每个数需要小于等于8(因为每个颜色最多就8个球)
[Python] 纯文本查看 复制代码
import random
box=['R']*8+['B']*8+['Y']*8        #  当然这种写法更加简便暴力。
target_lists=[]                          # 设置空列表承载目标(如:4/6/2组合)
for m in range(3):                   # 通过循环进行目标列表录入
    target=int(input('请依次输入三个数(需要计算的组合):'))
    if target<=8:
        target_lists.append(target)
    else:
        print('输入的数不符合要求') 
        break
target_lists.sort(reverse = True)   #对录入的列表进行降序
print(target_lists)                 # 辅助行,可有可无,就是看看列表能不能生成出来
if sum(target_lists)==12:
    choise_times=int(input('输入计算次数(默认为1000):') or 1000)                      
    j=0
    for i in range(choise_times+1):
        choise_result = random.sample(box,12)    # 在24个里随机抽12个
        final=[choise_result.count('R'),choise_result.count('B'),choise_result.count('Y')] #  将统计结果入列表
        final.sort(reverse = True)  #  降序排列
        if final==target_lists:
            j=j+1     
    print('出现该组合的概率大约是:',j/choise_times)    
else:
    print('输入的目标组合不符合要求')    


运行结果自行尝试,不再给出。

至此,这个简单的问题得以解决,代码中还有精进的余地,比如输入数据有问题后不是直接结束程序,而是重新输入(while可实现),或计算程序运行时间(time模块)等等。

远离赌博,珍爱生命!


免费评分

参与人数 1吾爱币 +5 热心值 +1 收起 理由
wushaominkk + 5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Aslands 发表于 2021-7-29 14:05
学习了,感谢楼的分享
gblw 发表于 2021-7-29 15:17
逸清尘ceo 发表于 2021-7-29 17:00
evayang 发表于 2021-7-29 21:53
要不一起摆地摊去
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 10:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表