自学python-5 摸球游戏
灵感来自一个视频意思是 箱子里有红、蓝、黄 三种颜色的球各8个,不管抽的次数,只管抽的总数,要12个球,如果这12个球里的颜色按照7/4/1分布,你就中100,如果是5/4/3你就输50,具体的输赢方式见图。
但凡有点数学常识的都知道这是概率问题,没有哪个摊主会傻呵呵的赔钱干买卖。
目前正在尝试用python实现这一算法
今天正好找到了跟这类似的比较简单的一个摸球游戏,顺便写了一下,等有机会实现视频里的算法并求出概率。
这道题也是比较经典的。
背景:在街头巷尾会遇到一类“摸球游戏”,摊主的游戏道具是把分别标有数字1,2,3的3个白球和标有数字4,5,6的3个黑球(球除颜色外,其他均相同)放在口袋里,让你摸球.规定:每付3元钱就玩一局,每局连续摸两次,每次只能摸一个,第一次摸完后把球放回口袋里搅匀后再摸一次,若前后两次摸得的都是白球,摊主就送你10元钱的奖品.
一、模拟摸球动作分别显示两次摸球的结果
准备一个容器,容纳6个球
box=('白1','白2','白3','黑4','黑5','黑6')
为啥用元组呢?因为元组里的数据不可改变,从意识上高度重视,其实列表也行
随机摸一个球
import random
box=('白1','白2','白3','黑4','黑5','黑6')
x=random.randint(0,5)
print(box) # 切片用法
为了更好地检查输出结果,调用一个循环验证
import random
box=('白1','白2','白3','黑4','黑5','黑6')
for i in range(30):
x=random.randint(0,5)
print(box)
将两次摸球的结果输出
import random
box=('白1','白2','白3','黑4','黑5','黑6')
for i in range(2):
x=random.randint(0,5)
print(box)
判断两次的结果(分别调用两个结果)
import random
box=('白1','白2','白3','黑4','黑5','黑6')
x=random.randint(0,5)
y=random.randint(0,5)
a=box
b=box
print(a,b)
if a==b and a=="白" : # 还能 a==b=="白"这样写?
print('赢了7元')
else:
print('输了3元')
多次进行游戏
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
b=box
print(a,b)
if a==b and a=="白" :
print('赢了7元')
else:
print('输了3元')
是否继续游戏由玩家决定
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
b=box
print(a,b)
if a==b and a=="白" :
print('赢了7元')
else:
print('输了3元')
else:
break
记录总花费与盈利
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
b=box
print(a,b)
if a==b and a=="白" :
print('赢了7元')
get=get+7
else:
print('输了3元')
i=i+1
print('总共花费了',lost*i,'赢了',get)
else:
break
简单的优化一下,让结果更突出,去除多余信息
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
b=box
print(a,b)
if a==b and a=="白" :
print('赢了7元')
get=get+7
i=i+1
print('总共花费了',lost*i,'赢了',get)
else:
break
二、获奖的概率
尝试用大量真实数据计算出来
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
b=box
print(a,b)
if a==b and a=="白" :
win=win+1
else:
lose=lose+1
i=i+1
print('赢',win,'输',lose)
继续优化,删除多余内容,计算结果
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
b=box
# print(a,b)
if a==b and a=="白" :
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左右(具体的因计算机处理能力而定)
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
b=box
# print(a,b)
if a==b and a=="白" :
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))
远离赌博,珍爱生命
随机选择数据,可以直接用random.choices吧{:301_998:} 沉默盛世 发表于 2021-4-7 12:29
随机选择数据,可以直接用random.choices吧
是的,知识匮乏,绕了很多弯路 还算不错吧,可以继续优化,比如做一个可视化界面之类的 扩展加大充值力度 感谢分享
挺好的小例子 这个选择出现 10 - 1 - 1的情况怎么办呢 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()
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)
if win_dict>0:
win=win + win_dict
else:
lose+= win_dict
end_time = time.time()
print('胜',win,'负',lose)
total_time = end_time - start_time
print("*****运算耗时{:.4}秒*****".format(total_time))
按这个样子似乎稳赚的,还是哪里搞错了 首先i = i+1 是没意义的
其次 赢和输都没写对,写了赢和赢
页:
[1]