本节书摘来异步社区《概率编程实战》一书中的第2章,第2.8节,作者:【美】Avi Pfeffer(艾维·费弗),更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.8 练习
在www.manning.com/books/practical-probabilistic-programming
上可以找到部分练习的解答。
1.扩展Hello World程序,添加表示下床的一侧(正确或者错误)的变量。如果从错误的一侧下床,问候语总为“Oh no, not again!”,如果从正确的一侧下床,问候语的逻辑和之前相同。
2.在原始Hello World程序中,观测到今天的问候语是“Oh no, not again!”,查询今天的天气。现在,观测相同的证据并在练习1中修改的程序上提出相同的查询。查询答案发生了什么变化?能否直观地解释该结果?
3.在Figaro中,可以使用代码x === z作为如下代码的简写:
Apply(x, z, (b1: Boolean, b2: Boolean) => b1 === b2)```
换言之,如果两个参数的值相等,产生一个值为true的元素。如果不运行Figaro,猜测下面两段程序生成的结果:
a) val x = Flip(0.4)
val y = Flip(0.4)
val z = x
val w = x === z
println(VariableElimination.probability(w, true))
b) val x = Flip(0.4)
val y = Flip(0.4)
val z = y
val w = x === z
println(VariableElimination.probability(w, true))`
现在,运行Figaro程序检查您的答案。
4.在下面的练习中,您将发现FromRange元素很有用。FromRange有两个整数参数m和n,生成m~n-1的随机整数。例如,FromRange(0, 3)生成0、1、2的概率相同。编写一段Figaro程序计算掷两个骰子得出总数11的概率。
5.编写一个Figaro程序计算第一个骰子掷出6时,两个骰子总数大于8的概率。
6.在“地产大亨”游戏中,当两个骰子掷出相同数字时可以多玩一个回合。如果连续三次出现这种情况,您就会入狱。编写一段Figaro程序计算任何一个回合中发生这种情况的概率。
7.想象一个游戏,您有一个轮盘和5个面数不同的骰子。轮盘有5个概率相等的结果:4、6、8、12和20。在游戏中,首先转动轮盘,然后滚动面数与轮盘结果相同的骰子。编写一个Figaro程序表现这个游戏。
a)计算滚动12面骰子的概率。
b)计算掷出数字7的概率。
c)已知掷出的是7,计算滚动的是12面骰子的概率。
d)已知滚动的是12面骰子,计算掷出数字7的概率。
8.现在,修改练习7中的游戏,轮盘有卡住的趋势,在连续两次转动时停在同一个结果处。使用与makeStreaky类似的逻辑,编写一个约束,说明两次相邻的转动得到相同值的概率高于不同值的概率。连续玩该游戏两次。
a)计算第二次掷骰子得到7的概率。
b)已知第一次掷骰子得到7,计算第二次掷出7的概率。