自学python-6 摸球游戏2 (填坑 python-5)
本帖最后由 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你就输 ,具体的输赢方式见图。
但凡有点数学常识的都知道这是概率问题,没有哪个摊主会傻呵呵的赔钱干买卖。
现对这一算法做简单的剖析
https://attach.52pojie.cn/forum/202104/07/113745r8wf581811728c55.png
除颜色不一样其他均一样的三种颜色(红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
思路:
准备容器存放球
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']
敲这个列表是不是很麻烦,当然了,这么多元素,还要加上‘ ’。用列表与运算实现吧
box_R=['R']*8
box_B=['B']*8
box_Y=['Y']*8
box=box_R+box_B+box_Y
print(box)
当然,这还不够,为了更好的区分出 此R非彼R,我们尝试在后面加上数字用于区分
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个
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']
为了更简便,我们采用不带数据编号的列表
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)
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
将计算结果放入列表,并从大到小排序,方便查看
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= #将统计结果入列表
final.sort(reverse = True)#降序排列
print(final)
运行结果(不唯一):
>['B', 'Y', 'Y', 'Y', 'R', 'R', 'B', 'B', 'B', 'R', 'B', 'Y']
>3
>5
>4
>
简化输出结果
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= #将统计结果入列表
final.sort(reverse = True)#降序排列
print(final)
判断结果,将结果录入,使用判断语句输出结果,仅做示例
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= #将统计结果入列表
final.sort(reverse = True)#降序排列
if final==:
print('输30')
else:
print('赢XX')
到这里基本就算ok了,如果还想精进,就要看你所出组合的概率了
计算各种数据出现的概率
通过多次循环,用出现的次数除以循环次数即可算出概率(非数学算法,试验算法)
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= #将统计结果入列表
final.sort(reverse = True)#降序排列
if final==:
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组合
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= #将统计结果入列表
final.sort(reverse = True)#降序排列
if final==target_lists:
j=j+1
print('出现该该组合的概率大约是:',j/choise_times)
如果用户输入的三个数的和不是12,即不满足抓出12个球,计算结果就是0,我们尝试做一下数据有效性的判断,规定输入。
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= #将统计结果入列表
final.sort(reverse = True)#降序排列
if final==target_lists:
j=j+1
print('出现该组合的概率大约是:',j/choise_times)
else:
print('输入的目标组合不符合要求')
运行结果(不唯一):
>请依次输入三个数(需要计算的组合):8
>请依次输入三个数(需要计算的组合):3
>请依次输入三个数(需要计算的组合):1
>>输入计算次数(默认为1000):
>出现该该组合的概率大约是: 0.001
如果用户输入 9、1、2 虽然满足和是12,但又不满足每个数需要小于等于8(因为每个颜色最多就8个球)
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= #将统计结果入列表
final.sort(reverse = True)#降序排列
if final==target_lists:
j=j+1
print('出现该组合的概率大约是:',j/choise_times)
else:
print('输入的目标组合不符合要求')
运行结果自行尝试,不再给出。
至此,这个简单的问题得以解决,代码中还有精进的余地,比如输入数据有问题后不是直接结束程序,而是重新输入(while可实现),或计算程序运行时间(time模块)等等。
远离赌博,珍爱生命!
{:1_921:}学习了,感谢楼的分享 感谢分享! 有效劝赌{:301_998:}按个赞 要不一起摆地摊去{:1_918:}
页:
[1]