Python模拟树概率
Python simulation tree probability
我必须编写一个模拟函数,用之前扩展的 play_pig 函数运行游戏 100,000 次。查看以绘制 5 美元钞票结束的模拟百分比。
在一年一度的集市上,有一个使用猪形状的存钱罐的游戏。在 1 号存钱罐中,有一张 5 美元的钞票和三张 1 美元的钞票。在 2 号存钱罐中,有一张 5 美元的钞票和一张 1 美元的钞票。播放
游戏中,你要从#1存钱罐中取出一张钞票,放入#2存钱罐中。将#2存钱罐中的内容混合后,你可以拿取其中一张钞票。从存钱罐#2 拿到 5 美元钞票的几率是多少?
class Expr:
pass
class Times(Expr) :
def __int__(self,l,r) :
slf.l = l
self.r= r
def _str_(self) :
return "(" + str(self.l) + "*" + str(self.r) + ")"
def eval(self,env) :
retunr slef.l.eval(env)*self.r.eval(env)
class Plus(Expr) :
def __int__(self,l,r) :
slf.l = l
self.r= r
def __str_(self) :
return "(" + str(self.l) + "*" + str(self.r) + ")"
def eval(self,env) :
retunr slef.l.eval(env)*self.r.eval(env)
Class Const(expr) :
def __int__(self,val) :
self.val = val
def __str__(self) :
return_str(self, val)
def eval(self,env) :
Class var (expr) :
pass
print(e1)
(3*(x,y))
我只是想不出使用 python 的正确方法。
解析解
B1 = bill pulled from piggy bank 1
B2 = bill pulled from piggy bank 2
P(B2 = 5) is the probability of pulling a 5 from piggy bank 2
B1 值的条件:
P(B2 = 5|B1 = 1) = 1/3
P(B2 = 5|B1 = 5) = 2/3
求解无条件概率:
P(B2 = 5) = P(B2 = 5|B1 = 1) * P(B1 = 1) + P(B2 = 5|B1 = 5) * P(B1 = 5)
P(B2 = 5) = (1/3) * (1/4) + (2/3) * (3/4) = 58.333%
从概念上讲,您可以将其视为概率树。当您通过分析解决这个问题时,这真的很有帮助。但是,当您编写这样的代码时,除非您尝试编写分析性地解决问题的代码,否则它真的不是您想要做的。与其编写代码来复制数学,不如编写代码来复制这种情况。然后你 运行 通过这种情况 N 次并且 观察 概率。
import random
import collections
piggy_bank_a = [5, 1, 1, 1]
piggy_bank_b = [5, 1]
outcomes = []
for experiment in range(100_000):
bill_a = random.choice(piggy_bank_a)
outcomes.append(random.choice(piggy_bank_b + [bill_a]))
totals = collections.Counter(outcomes)
我的总数是这样的:
Counter({1: 58273, 5: 41727})
我必须编写一个模拟函数,用之前扩展的 play_pig 函数运行游戏 100,000 次。查看以绘制 5 美元钞票结束的模拟百分比。
在一年一度的集市上,有一个使用猪形状的存钱罐的游戏。在 1 号存钱罐中,有一张 5 美元的钞票和三张 1 美元的钞票。在 2 号存钱罐中,有一张 5 美元的钞票和一张 1 美元的钞票。播放 游戏中,你要从#1存钱罐中取出一张钞票,放入#2存钱罐中。将#2存钱罐中的内容混合后,你可以拿取其中一张钞票。从存钱罐#2 拿到 5 美元钞票的几率是多少?
class Expr:
pass
class Times(Expr) :
def __int__(self,l,r) :
slf.l = l
self.r= r
def _str_(self) :
return "(" + str(self.l) + "*" + str(self.r) + ")"
def eval(self,env) :
retunr slef.l.eval(env)*self.r.eval(env)
class Plus(Expr) :
def __int__(self,l,r) :
slf.l = l
self.r= r
def __str_(self) :
return "(" + str(self.l) + "*" + str(self.r) + ")"
def eval(self,env) :
retunr slef.l.eval(env)*self.r.eval(env)
Class Const(expr) :
def __int__(self,val) :
self.val = val
def __str__(self) :
return_str(self, val)
def eval(self,env) :
Class var (expr) :
pass
print(e1)
(3*(x,y))
我只是想不出使用 python 的正确方法。
解析解
B1 = bill pulled from piggy bank 1
B2 = bill pulled from piggy bank 2
P(B2 = 5) is the probability of pulling a 5 from piggy bank 2
B1 值的条件:
P(B2 = 5|B1 = 1) = 1/3
P(B2 = 5|B1 = 5) = 2/3
求解无条件概率:
P(B2 = 5) = P(B2 = 5|B1 = 1) * P(B1 = 1) + P(B2 = 5|B1 = 5) * P(B1 = 5)
P(B2 = 5) = (1/3) * (1/4) + (2/3) * (3/4) = 58.333%
从概念上讲,您可以将其视为概率树。当您通过分析解决这个问题时,这真的很有帮助。但是,当您编写这样的代码时,除非您尝试编写分析性地解决问题的代码,否则它真的不是您想要做的。与其编写代码来复制数学,不如编写代码来复制这种情况。然后你 运行 通过这种情况 N 次并且 观察 概率。
import random
import collections
piggy_bank_a = [5, 1, 1, 1]
piggy_bank_b = [5, 1]
outcomes = []
for experiment in range(100_000):
bill_a = random.choice(piggy_bank_a)
outcomes.append(random.choice(piggy_bank_b + [bill_a]))
totals = collections.Counter(outcomes)
我的总数是这样的:
Counter({1: 58273, 5: 41727})