Python中条件概率问题的仿真

时间:2018-11-01 15:44:59

标签: python

我正在尝试模拟一个简单的条件概率问题。你有两个盒子。如果您打开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)

4 个答案:

答案 0 :(得分:1)

您可以通过使用列表推导和numpy的数组操作来使代码更紧密,如下所示:

tfrecord

答案 1 :(得分:0)

appendlist操作;您将其强制放置在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。