python蒙特卡洛模拟概率及均值计算

做的过程中遇到了一个问题,用if,else时用错了,还好纠正过来了。

这里附上一个链接,以方便查找:Python - if、if else 、if else

1.投掷一枚硬币,求3比4先发生的概率P

import numpy as np
def one_res():
    a=[]
    for i in range(0,100):
        a.append(np.random.randint(1,7))
        if 3 or 4 in a:
            if 3 in a:
                k=1
                break
            if 4 in a:
                k=0
                break
    return(k)
res=[]
for i in range(0,10000):
    res.append(one_res())
pro=sum(res)/10000
print(pro)

运行结果:0.499接近0.5

2.投掷一枚硬币,直到出现两次正面朝上,记投掷次数为X,求EX

import pandas as pd
import random
def ran_number(a,b):
    c=[]
    c.append(random.randint(a, b))
    for i in range(0,50):
        if 1 not in c:
            c.append(random.randint(a, b))
        else:
            result = pd.value_counts(c)
            if result[1]==1:
                c.append(random.randint(a, b))
            if result[1]==2:
                k=i+1
                return(k)
                break
n=[]
for j in range(0,1000):
    n.append(ran_number(0,1))
mean=sum(n)/1000
print(mean)

运行结果:4.022接近4


3.投掷一枚硬币,直到出现连续两次正面朝上,记投掷次数为X,求EX

一道机器学习岗位面试题:平均要抛多少次硬币,才能出现连续两次正面向上?

import pandas as pd
import random
def ran_number(a,b):
    c=[]
    c.append(random.randint(a, b))
    c.append(random.randint(a, b))
    for i in range(0,50):
        if c[-1]+c[-2]==2:
            k=i+2
            return k
            break
        else:
            c.append(random.randint(a, b))
n=[]
for j in range(0,10000):
    n.append(ran_number(0,1))
mean=sum(n)/10000
print(mean)

运行结果:5.9837接近6


4.双骰子博弈的玩法如下:玩家投两颗骰子,如果其和是7或11,他就赢。如果其和是2,3,或12,他就输。如果是其他结果,就继续玩,直至他再次投到这个点数(则他赢),或者他投到7(则他输),计算玩家赢的概率。

import random
import numpy as np
def one_res():
    res = sum(np.random.randint(1,7,size=2))  #np.random.randint()方法的取值区间是前闭后开区间
    if res==7 or res==11:
        i=1
    elif res==2 or res==3 or res==12:
        i=0
    else:
        for e in range(0,100000):
            out=sum(np.random.randint(1,7,size=2))
            if out==res:
                i=1
                break
            elif out==7:
                i=0
                break
    return i
a=[]
for i in range(0,1000000):#做一百万次试验
    a.append(one_res())
pro=sum(a)/1000000
print(pro)

运行结果:0.4915接近0.49

下面这个是同学写的:

times=[]
import numpy as np
for e in range(0,1000000):
    res = sum(np.random.randint(1, 7, size=2))
    res2 = sum(np.random.randint(1, 7, size=2))
    if res == 7 or res == 11:
        i = 1
    elif res == 2 or res == 3 or res == 12:
        i = 0
    else:
        while res2!=res and res2!=7:
            res2=sum(np.random.randint(1, 7, size=2))
        if res2==res:
            i=1
        if res2==7:
            i=0
    times.append(i)
pro=np.mean(times)
print(pro)

 

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值