我正在尝试模拟一个简单的条件概率问题。你有两个盒子。如果您打开A,则有50%的中奖机会;如果您打开B,则有75%的中奖机会。使用一些简单的(不好的)python我很累 但是附加操作无效。对这种更整洁的方式有什么想法吗?
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)
答案 0 :(得分:1)
您可以通过使用列表推导和numpy的数组操作来使代码更紧密,如下所示:
tfrecord
答案 1 :(得分:0)
append
是list
操作;您将其强制放置在numpy
数组上,这是不一样的。坚持使用常规列表,因为您没有使用特定于数组的扩展名。
def simulate(n):
trials = []
for i in range(n):
if random.random() <= 0.5:
trials.append(liveORdie(0.5))
现在查看您的liveORdie例程。我不认为这是您想要的:您循环100次以生成一个整数……并且如果您的任何 one 测试成功完成,则返回1
。由于您尚未提供算法的文档,因此我不能确定想要什么,但是我怀疑它是100个试验的列表,而不是所有100个试验的结合。您需要{ {1}}也在这里。
更好的方法是遍历 list理解的教程,并使用它们。
答案 2 :(得分:0)
liveORdie()
中的循环(对于命名约定,请考虑PEP8)将导致获胜的可能性增加:循环的每一遍都有prop
获胜的机会,您给它100次尝试,所以有50%的响应。 75%您极有可能获胜。
除非我真的误解了问题,否则您可能只是想
def live_or_die(prob):
return random.random() < prob
答案 3 :(得分:0)
我很确定这只会减少到:
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 - 0.5**100
是〜1e-30。