翻牌游戏概率模拟

        假如有9张扣着的牌,其中7张普通牌各自翻出猫的概率相同,比如5%能翻出来( 95%翻出来不是猫),一 张简单牌,翻出来猫的概率是20%,一张困难牌,翻出来猫的概率是1%。我现在有三轮翻牌机会,每轮都可以把所有牌翻开,全都翻开后为一轮结束,每轮结束后除了翻出来猫的牌其余全都扣回去,猫牌就留在原地不动,之后猫牌不再参与翻牌,然后进行下一轮翻牌。要是翻出来猫的话,不管几个,翻牌机会可以重置为3轮。当翻牌机会用完或者所有牌都翻出来猫游戏结束。


        举个例子,比如9张牌编号1-9,1-7为普通,8为简单,9为困难, 我第一轮翻完时,8翻出了猫,这时我剩下的机会不是2轮而是重置为了3轮,下轮我只需要翻17和9, 8已经是猫就不用再翻了。然后接下来三轮每轮我都没翻出来猫,机会耗尽,所以这次游戏结束结果统计为1。

import random as ra

def generate(normal, simple, hard):
    is_cat_normal = [0]
    is_cat_simple = [0]
    is_cat_hart = [0]
    for i in range(normal):
        is_cat = ra.random() * 100
        if is_cat < 5:
            is_cat_normal.append(1)
        else:
            is_cat_normal.append(0)
    for i in range(simple):
        is_cat = ra.random() * 100
        if is_cat < 20:
            is_cat_simple.append(1)
        else:
            is_cat_simple.append(0)
    for i in range(hard):
        is_cat = ra.random() * 100
        if is_cat < 1:
            is_cat_hart.append(1)
        else:
            is_cat_hart.append(0)
    return is_cat_normal, is_cat_simple, is_cat_hart


def game():
    sum_ = 0
    count = 3
    normal, simple, hard = 7, 1, 1
    while count > 0 & sum_ < 9:
        count -= 1
        cat1, cat2, cat3 = generate(normal, simple, hard)
        has_cat1 = sum(cat1)
        has_cat2 = sum(cat2)
        has_cat3 = sum(cat3)
        sum_ += has_cat1 + has_cat2 + has_cat3
        if has_cat1 != 0 or has_cat2 != 0 or has_cat3 != 0:
            count = 3
            normal -= has_cat1
            simple -= has_cat2
            hard -= has_cat3
    return sum_


if __name__ == '__main__':
    time = 10000 * 50
    result = dict()
    for i in range(10):
        result[i] = 0
    for i in range(time):
        res = game()
        result[res] += 1
    print(result)
    for i in range(10):
        result[i] = "{0:.10f}".format(result[i] / time)
    print(result)

     模拟 50万次结果

{0: 84903, 1: 80804, 2: 90632, 3: 85654, 4: 68857, 5: 47392, 6: 26958, 7: 11358, 8: 3073, 9: 369}

 

{0: '0.1698060000', 1: '0.1616080000', 2: '0.1812640000', 3: '0.1713080000', 4: '0.1377140000', 5: '0.0947840000', 6: '0.0539160000', 7: '0.0227160000', 8: '0.0061460000', 9: '0.0007380000'}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值