se6cxpp 发表于 2021-4-7 11:51

自学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))




远离赌博,珍爱生命







沉默盛世 发表于 2021-4-7 12:29

随机选择数据,可以直接用random.choices吧{:301_998:}

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

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))

按这个样子似乎稳赚的,还是哪里搞错了

Test_dada 发表于 2021-4-26 17:16

首先i = i+1 是没意义的
其次 赢和输都没写对,写了赢和赢
页: [1]
查看完整版本: 自学python-5 摸球游戏