python中条件概率问题的仿真



我试图模拟一个简单的条件概率问题。你有两个盒子。如果你打开A,你有50%的中奖几率,如果你打开B,你有75%的中奖几率。有了一些简单(坏(的蟒蛇,我累了但是附加不起作用。有没有想过更整洁的方法?

import random
import numpy as np
def liveORdie(prob):
#Takes an argument of the probability of survival
live = 0
for i in range(100):
if random.random() <= prob*1.0:
live =1
return live
def simulate(n):
trials = np.array([0])
for i in range(n):
if random.random() <= 0.5:
np.append(trials,liveORdie(0.5))
print(trials)
else:
np.append(trials,liveORdie(0.75))
return(sum(trials)/n)

simulate(10)

您可以通过使用列表理解和numpy的数组操作使代码更加紧凑,比如:

import random
import numpy as np
def LiveOrDie():
prob = 0.5 if random.random()<=0.5 else 0.75
return np.sum(np.random.random(100)<=prob)
def simulate(n):
trials = [LiveOrDie() for x in range(n)]
return(sum(trials)/n)
Simulate(10)

append是一个list操作;您将它强制到numpy数组上,这不是一回事。坚持使用常规列表,因为您没有使用任何特定于数组的扩展。

def simulate(n):
trials = []
for i in range(n):
if random.random() <= 0.5:
trials.append(liveORdie(0.5))

现在看看你的liveORdie程序。我不认为这是你想要的:你循环100次,得到一个整数。。。如果您的任何一个试验成功,则返回1。由于您还没有提供算法的文档,我不确定您想要什么,但我怀疑这是一个100次试验的列表,而不是所有100次的总和。你也需要在这里append

更好的是,运行列表理解的教程,并使用这些教程。

liveORdie()中的循环(命名惯例请考虑PEP8(会导致获胜概率增加:循环的每一次通过都有prop获胜的机会,你给它100次尝试,因此有50%的响应。75%你极有可能获胜。

除非我真的误解了这个问题,否则你可能只想要

def live_or_die(prob):
return random.random() < prob

我很确定这只是减少到:

from numpy import mean
from numpy.random import choice
from scipy.stats import bernoulli
def simulate(n):
probs = choice([0.5, 0.75], n)
return 1-mean(bernoulli.rvs((1-probs)**100))

正如其他人所指出的,其基本上将总是返回1-CCD_。

最新更新