随机方法解决七选五,骰子和硬币问题的例子

蒙特卡洛思想

七选五全错的概率

英语七选五,选择时不包括重复选项,任意选,全错的概率。

import numpy as np
import time
selection = [1,2,3,4,5,6,7]
cnt = 0 #猜对次数
batch = 1e5 # 测试总次数
start = time.time()
for i in range(int(batch)):
    # 生成标准答案
    tmp = selection[:]
    for j in range(2):
        num = np.random.randint(len(tmp))
        tmp.remove(tmp[num])
    np.random.shuffle(tmp)

    #随机猜一个答案
    test = selection[:]
    for j in range(2):
        num = np.random.randint(len(test))
        test.remove(test[num])
    np.random.shuffle(test)

    tmp = np.array(tmp)
    test = np.array(test)
    ans = tmp-test
    # 全部答案错误
    if 0 not in ans:
        cnt+=1
end = time.time()
print("试验:",cnt,"/",batch,"=",cnt/batch)
print("理论值:",607/1260)
print("time:",end-start)
        

在这里插入图片描述

骰子问题

每个骰子完全一样,每个面完全均匀,上面有1-6,现在第一次任意掷m个骰子,第二次任意掷n个骰子,问第一次所有骰子点数之和大于第二次的概率?
情况很复杂,就对m,n赋值来计算。

import random as r

def rand():
    return r.randint(1,6)


def mcrol(a,b):
    ret1 = 0
    ret2 = 0

    for i in range(1000000):
        sum1 = 0
        sum2 = 0
        for j in range(a):
            sum1 = sum1 + rand()

        for k in range(b):
            sum2 = sum2 + rand()

        if sum1 > sum2:
            ret1 = ret1 + 1
        else:
            ret2 = ret2 + 1
    print(ret1)
    print(ret2)
    print(ret1/(ret1+ret2))
    print()
'''
mcrol(2,1) #0.838261
mcrol(8,4) #0.98948
mcrol(7,8) #0.27502
mcrol(8,6) #0.844521
mcrol(6,4) #0.88397
mcrol(2,2) #0.44
mcrol(3,3) #0.45
mcrol(4,4) #0.45
mcrol(8,8) #0.47
mcrol(3,2) #0.77
'''

硬币问题

现甲乙两人博弈,一枚完全均匀的硬币,投掷很多次,直到分出胜负。
甲胜的条件:硬币连续出现,正,反,反。
乙胜的条件:硬币连续出现,反,反,正。
证明:甲胜的概率是乙的三倍。

import random

count1 = 0
count2 = 0
eig_1 = [1,0,0] #正反反
eig_2 = [0,0,1] #反反正
for i in range(1000000):
    compare = []
    while True:
        x = random.randint(0,1)
        compare += [x]
        if len(compare)<3:
            continue
        if compare[-3:] == eig_1:
            count1 += 1
            break
        if compare[-3:] == eig_2:
            count2 += 1
            break

print(count1)
print(count2)

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值