se6cxpp 发表于 2021-7-29 13:08

自学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模块)等等。

远离赌博,珍爱生命!


Aslands 发表于 2021-7-29 14:05

{:1_921:}学习了,感谢楼的分享

gblw 发表于 2021-7-29 15:17

感谢分享!

逸清尘ceo 发表于 2021-7-29 17:00

有效劝赌{:301_998:}按个赞

evayang 发表于 2021-7-29 21:53

要不一起摆地摊去{:1_918:}
页: [1]
查看完整版本: 自学python-6 摸球游戏2 (填坑 python-5)