作为样本空间子集的随机事件可以由样本空间中的样本点满足一定的条件来确定。为方便应用,我们设计如下的函数来为指定样本空间设置指定条件的随机事件:
def subSet(S, condition): #设置符合条件condition的事件
A = set() #A初始化为空集
for x in S: #样本空间中找符合条件的样本点
if condition(x): #样本点x满足条件condition
A.add(x) #加入A
return A
Python中自定义的函数,其首部由关键字def开头,函数名(subSet)后跟用圆括弧括起来的形式参数(S和condition)。程序中定义了事件的设置函数sutSet。该函数的功能是用传递给它的表示样本空间的参数S和表示随机事件中的样本点需满足的条件的参数condition,从S中筛选满足condition的元素构成一个事件A并返回。其中,第2~6行为函数体。函数体内的代码相对于函数首部而言,需向右缩进若干字符位置。利用行内注释不难理解:
第2行将事件A初始化为空集。第3-5行for语句完成对作为样本空间的集合S的扫描,对其中的每一个元素(样本点)a,作为循环体的第4~5行的if语句检测其是否满足条件condition(condition本身也是一个函数,它对传递给它的参数a做制定检测,符合检测条件则返回布尔值True,否则返回False)。若符合condition,则在第5行将a加入到A中(调用set类对象A的方法add)。扫描结束时,A中包含了所有满足condition的元素。第6行的return语句把设置好的事件A作为返回值返回。
下面我们来看一个运用subSet函数设置随机事件的例子。
例1向指定目标连续射击三枪,设
A
i
=
A_i=
Ai=“第
i
i
i枪击中目标”(
i
=
1
,
2
,
3
i=1, 2, 3
i=1,2,3),则
- “至少有一枪击中目标”: A 1 ∪ A 2 ∪ A 3 A_1\cup A_2\cup A_3 A1∪A2∪A3;
- “三枪都击中目标”: A 1 ∩ A 2 ∩ A 3 A_1\cap A_2\cap A_3 A1∩A2∩A3;
- “只有第一枪击中目标”: A 1 ∩ A ˉ 2 ∩ A ˉ 3 A_1\cap\bar{A}_2\cap\bar{A}_3 A1∩Aˉ2∩Aˉ3;
- “恰有一枪击中目标”: A 1 ∩ A ˉ 2 ∩ A ˉ 3 ∪ A ˉ 1 ∩ A 2 ∩ A ˉ 3 ∪ A ˉ 1 ∩ A ˉ 2 ∩ A 3 A_1\cap \bar{A}_2\cap \bar{A}_3\cup \bar{A}_1\cap A_2\cap \bar{A}_3\cup \bar{A}_1\cap \bar{A}_2\cap A_3 A1∩Aˉ2∩Aˉ3∪Aˉ1∩A2∩Aˉ3∪Aˉ1∩Aˉ2∩A3;
- “三枪都没有击中目标”: ( A 1 ∪ A 2 ∪ A 3 ) ‾ = A ˉ 1 ∩ A ˉ 2 ∩ A ˉ 3 \overline{(A_1\cup A_2\cup A_3 )}=\bar{A}_1\cap\bar{A}_2\cap\bar{A}_3 (A1∪A2∪A3)=Aˉ1∩Aˉ2∩Aˉ3;
- “至少有一枪没有击中目标”: ( A 1 ∩ A 2 ∩ A 3 ) ‾ = A ˉ 1 ∪ A ˉ 2 ∪ A ˉ 3 \overline{ (A_1\cap A_2\cap A_3 )}=\bar{A}_1\cup\bar{A}_2\cup\bar{A}_3 (A1∩A2∩A3)=Aˉ1∪Aˉ2∪Aˉ3。
假定用1表示击中,0表示未击中。则三次射击的结果,即一个样本点可表为三元组
(
i
,
j
,
k
)
(i, j, k)
(i,j,k)。其中的每个分量取值均为0或1。样本空间S就是由所有这样的三元组构成的集合。事件
A
1
A_1
A1表示第1枪击中,也就是样本空间S中满足第1个分量i为1的样本点构成的集合。相仿地,事件
A
2
A_2
A2是由S中满足第2个分量j为1的样本点构成的集合,
A
3
A_3
A3是由S中第3个分量k为1的样本点构成的集合。
将样本点的表达形式的约定和对样本空间S及事件
A
1
A_1
A1,
A
2
A_2
A2,
A
3
A_3
A3的思考表示成Python程序如下:
from sympy.utilities.iterables import variations as permutations#导入variations
S=set(permutations([0,1],3,True)) #设置样本空间
A1=subSet(S, lambda a: a[0]==1) #设置事件A1
A2=subSet(S, lambda a: a[1]==1) #设置事件A2
A3=subSet(S, lambda a: a[2]==1) #设置事件A3
A_1=S-A1 #计算A1的对立事件
A_2=S-A2 #计算A2的对立事件
A_3=S-A3 #计算A3的对立事件
print('(1)至少击中1枪=%s'%(A1|A2|A3)) #至少击中一枪
print('(2)3枪都击中=%s'%(A1&A2&A3)) #3枪都击中
print('(3)只有第1枪击中目标=%s'%(A1&A_2&A_3)) #只有第1枪击中目标
print('(4)恰击中1枪=%s'%(A1&A_2&A_3|A_1&A2&A_3|A_1&A_2&A3)) #恰击中一枪
print('(5)3枪都未击中=%s'%(S-(A1|A2|A3))) #三枪均未击中
print('(6)至少有1枪未击中=%s'%(S-(A1&A2&A3))) #至少有1枪未击中
程序的第2行调用permutations(第1行导入)构造表示样本空间的S。
第3、4、5行调用我们在前面定义的subSet函数,创建事件
A
1
A_1
A1,
A
2
A_2
A2和
A
3
A_3
A3。回顾sutSet函数用参数condition,在样本空间S中筛选符合condition条件的样本点来设置事件。其中condition(a)是一个返回值为布尔值的函数,其功能就是检测样本点是否符合特定的条件,符合返回True,否则返回False。例如,事件“第1枪击中目标”
A
1
A_1
A1,其中的样本点a=(i,j,k)需满足其第一个分量i=1。在Python中,元组中的分量可以用下标访问,即a[0]==1。这样我们可以定义如下的函数来表示这一条件:
def conditionA1(a):
if a[0]==1:
return True
return False
然而,Python为程序员提供了一个与简单函数定义等价的称为lambda的运算符:
lambda 参数: 返回对参数进行处理的布尔表达式值
例如,与上述函数conditionA1等价的lambda表达式为:
lambda a: a[0]==1
这就是第3行中传递给subSet的扮演condition角色的参数,以此设置事件
A
1
A_1
A1:“第1枪击中目标”。相仿地,第4行、第5行分别设置事件
A
2
A_2
A2和
A
3
A_3
A3。
第6、7、8行分别创建
A
1
A_1
A1、
A
2
A_2
A2和
A
3
A_3
A3的对立事件
A
ˉ
1
\bar{A}_1
Aˉ1、
A
ˉ
2
\bar{A}_2
Aˉ2和
A
ˉ
3
\bar{A}_3
Aˉ3。
第9~14行按例5中得到的结果,用事件的运算输出计算结果。运行程序1.3后输出结果:
(1)至少击中1枪={(1, 1, 0), (0, 1, 1), (0, 1, 0), (1, 0, 0), (0, 0, 1),(1, 0, 1), (1, 1, 1)}
(2)3枪都击中={(1, 1, 1)}
(3)只有第1枪击中目标={(1, 0, 0)}
(4)恰击中1枪={(1, 0, 0), (0, 1, 0), (0, 0, 1)}
(5)3枪都未击中={(0, 0, 0)}
(6)至少有1枪未击中={(0, 1, 1), (1, 1, 0), (1, 0, 0), (0, 0, 1), (1, 0, 1),(0, 0, 0), (0, 1, 0)}
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
代码诚可贵,原理价更高。若为AI学,读正版书好。
返回《导引》