吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3370|回复: 9
收起左侧

[Python 转载] 自学python-5 摸球游戏

[复制链接]
se6cxpp 发表于 2021-4-7 11:51
灵感来自一个视频
image.png
意思是 箱子里有红、蓝、黄 三种颜色的球各8个,不管抽的次数,只管抽的总数,要12个球,如果这12个球里的颜色按照7/4/1分布,你就中100,如果是5/4/3你就输50  ,具体的输赢方式见图。
但凡有点数学常识的都知道这是概率问题,没有哪个摊主会傻呵呵的赔钱干买卖。
目前正在尝试用python实现这一算法

今天正好找到了跟这类似的比较简单的一个摸球游戏,顺便写了一下,等有机会实现视频里的算法并求出概率。
这道题也是比较经典的。


背景:在街头巷尾会遇到一类“摸球游戏”,摊主的游戏道具是把分别标有数字1,2,3的3个白球和标有数字4,5,6的3个黑球(球除颜色外,其他均相同)放在口袋里,让你摸球.规定:每付3元钱就玩一局,每局连续摸两次,每次只能摸一个,第一次摸完后把球放回口袋里搅匀后再摸一次,若前后两次摸得的都是白球,摊主就送你10元钱的奖品.


一、模拟摸球动作分别显示两次摸球的结果
准备一个容器,容纳6个球
[Python] 纯文本查看 复制代码
box=('白1','白2','白3','黑4','黑5','黑6')

为啥用元组呢?因为元组里的数据不可改变,从意识上高度重视,其实列表也行

随机摸一个球
[Python] 纯文本查看 复制代码
import random

box=('白1','白2','白3','黑4','黑5','黑6')
x=random.randint(0,5)
print(box[x])            # 切片用法


为了更好地检查输出结果,调用一个循环验证
[Python] 纯文本查看 复制代码
import random

box=('白1','白2','白3','黑4','黑5','黑6')
for i in range(30):
    x=random.randint(0,5)
    print(box[x])    


将两次摸球的结果输出


[Python] 纯文本查看 复制代码
import random

box=('白1','白2','白3','黑4','黑5','黑6')
for i in range(2):
    x=random.randint(0,5)
    print(box[x])  


判断两次的结果(分别调用两个结果)
[Python] 纯文本查看 复制代码
import random

box=('白1','白2','白3','黑4','黑5','黑6')
x=random.randint(0,5)
y=random.randint(0,5)
a=box[x]
b=box[y]
print(a,b)
if a[0]==b[0] and a[0]=="白" :      #       还能   a[0]==b[0]=="白"  这样写?
    print('赢了7元')
else:
    print('输了3元')


多次进行游戏
[Python] 纯文本查看 复制代码
import random

box=('白1','白2','白3','黑4','黑5','黑6')
for i in range(10):
    x=random.randint(0,5)
    y=random.randint(0,5)
    a=box[x]
    b=box[y]
    print(a,b)
    if a[0]==b[0] and a[0]=="白" :      
        print('赢了7元')
    else:
        print('输了3元')


是否继续游戏由玩家决定
[Python] 纯文本查看 复制代码
import random

box=('白1','白2','白3','黑4','黑5','黑6')
for i in range(10):
    c=input("是否继续(1继续、2退出):")
    if c=="1" :
        x=random.randint(0,5)
        y=random.randint(0,5)
        a=box[x]
        b=box[y]
        print(a,b)
        if a[0]==b[0] and a[0]=="白" :      
            print('赢了7元')
        else:
            print('输了3元')
    else:
        break


记录总花费与盈利
[Python] 纯文本查看 复制代码
import random
get=0
lost=3
box=('白1','白2','白3','黑4','黑5','黑6')
for i in range(10):
    c=input("*****是否继续(1继续、2退出):*****")
    if c=="1" :
        x=random.randint(0,5)
        y=random.randint(0,5)
        a=box[x]
        b=box[y]
        print(a,b)
        if a[0]==b[0] and a[0]=="白" :      
            print('赢了7元')
            get=get+7
        else:
            print('输了3元')
        i=i+1
        print('总共花费了',lost*i,'赢了',get)
    else:
        break



简单的优化一下,让结果更突出,去除多余信息
[Python] 纯文本查看 复制代码
import random
get=0
lost=3
box=('白1','白2','白3','黑4','黑5','黑6')
for i in range(10):
    c=input("*****是否继续(1继续、2退出):*****")
    if c=="1" :
        x=random.randint(0,5)
        y=random.randint(0,5)
        a=box[x]
        b=box[y]
        print(a,b)
        if a[0]==b[0] and a[0]=="白" :      
            print('赢了7元')
            get=get+7
        i=i+1
        print('总共花费了',lost*i,'赢了',get)
    else:
        break


二、获奖的概率
尝试用大量真实数据计算出来
[Python] 纯文本查看 复制代码
import random
win=0
lose=0
box=('白1','白2','白3','黑4','黑5','黑6')
z=int(input('请输入试验次数:'))
for i in range(z):
    x=random.randint(0,5)
    y=random.randint(0,5)
    a=box[x]
    b=box[y]
    print(a,b)
    if a[0]==b[0] and a[0]=="白" :      
        win=win+1
    else:
        lose=lose+1
    i=i+1
    print('赢',win,'输',lose)


继续优化,删除多余内容,计算结果
[Python] 纯文本查看 复制代码
import random
win=0
lose=0
box=('白1','白2','白3','黑4','黑5','黑6')
z=int(input('请输入试验次数:'))
for i in range(z):
    x=random.randint(0,5)
    y=random.randint(0,5)
    a=box[x]
    b=box[y]
#     print(a,b)
    if a[0]==b[0] and a[0]=="白" :      
        win=win+1
    else:
        lose=lose+1
    i=i+1
print('赢',win,'赢',lose)
m=win/z
n=lose*3-win*7
print("中奖概率是{:.3f},最后获利{}".format(m,n))


三、记录计算机处理数据的时间
10万级的数据基本在0.5s左右(具体的因计算机处理能力而定)

[Python] 纯文本查看 复制代码
import random,time

win=0
lose=0
box=('白1','白2','白3','黑4','黑5','黑6')
z=int(input('请输入试验次数:'))
start_time = time.time()          #注意计时 代码放的位置
for i in range(z):
    x=random.randint(0,5)
    y=random.randint(0,5)
    a=box[x]
    b=box[y]
#     print(a,b)
    if a[0]==b[0] and a[0]=="白" :      
        win=win+1
    else:
        lose=lose+1
    i=i+1
end_time = time.time()
print('赢',win,'赢',lose)
m=win/z
n=lose*3-win*7
print("中奖概率是{:.3f},摊主最后获利{}".format(m,n))
total_time = end_time - start_time
print("*****运算耗时{:.4}秒*****".format(total_time))





远离赌博,珍爱生命







免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
鎏丿情何以堪 + 1 + 1 我很赞同!
埋里埋小埋 + 1 + 1 用心讨论,共获提升!

查看全部评分

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

沉默盛世 发表于 2021-4-7 12:29
随机选择数据,可以直接用random.choices吧
 楼主| se6cxpp 发表于 2021-4-7 12:40
沉默盛世 发表于 2021-4-7 12:29
随机选择数据,可以直接用random.choices吧

是的,知识匮乏,绕了很多弯路
雨中独撑伞 发表于 2021-4-7 12:52
还算不错吧,可以继续优化,比如做一个可视化界面之类的
lsy832 发表于 2021-4-7 12:57
扩展加大充值力度
cyyu 发表于 2021-4-7 13:49
感谢分享
Doublevv 发表于 2021-4-7 14:50
挺好的小例子
dleo 发表于 2021-4-7 20:00
这个选择出现 10 - 1 - 1的情况怎么办呢
dleo 发表于 2021-4-7 20:08
[Python] 纯文本查看 复制代码
import random,time
from collections import Counter
win=0
lose=0
box=['红']*6+['绿']*6+['蓝']*6
win_dict={
    '843':300,
    '831':200,
    '822':100,
    '750':150,
    '741':100,
    '732':50,
    '660':50,
    '642':30,
    '552':80,
    '543':-50,
    '552':60,
    '444':180,
}
# print(box)
z=int(input('请输入试验次数:'))
start_time = time.time()   
for i in range(z):
    x=list(Counter(random.choices(box,k=12)).values()) #随机选12个 并计算每个元素的个数
    x.sort(reverse=True) #排序从大到小
    result = "".join([str(j) for j in x])
    result = '750' if result=='75' else result
    result = '660' if result=='66' else result
    result = '840' if result=='84' else result
    if result in win_dict.keys():
        print(result,win_dict[result])
        if win_dict[result]>0:
            win=win + win_dict[result]
        else:
            lose+= win_dict[result]
end_time = time.time()
print('胜',win,'负',lose)
total_time = end_time - start_time
print("*****运算耗时{:.4}秒*****".format(total_time))


按这个样子似乎稳赚的,还是哪里搞错了
Test_dada 发表于 2021-4-26 17:16
首先i = i+1 是没意义的
其次 赢和输都没写对,写了赢和赢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-25 16:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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