概率统计Python计算:按条件设置随机事件

在这里插入图片描述
作为样本空间子集的随机事件可以由样本空间中的样本点满足一定的条件来确定。为方便应用,我们设计如下的函数来为指定样本空间设置指定条件的随机事件:

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),则

  1. “至少有一枪击中目标”: A 1 ∪ A 2 ∪ A 3 A_1\cup A_2\cup A_3 A1A2A3
  2. “三枪都击中目标”: A 1 ∩ A 2 ∩ A 3 A_1\cap A_2\cap A_3 A1A2A3
  3. “只有第一枪击中目标”: A 1 ∩ A ˉ 2 ∩ A ˉ 3 A_1\cap\bar{A}_2\cap\bar{A}_3 A1Aˉ2Aˉ3
  4. “恰有一枪击中目标”: 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 A1Aˉ2Aˉ3Aˉ1A2Aˉ3Aˉ1Aˉ2A3
  5. “三枪都没有击中目标”: ( 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 (A1A2A3)=Aˉ1Aˉ2Aˉ3
  6. “至少有一枪没有击中目标”: ( 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 (A1A2A3)=Aˉ1Aˉ2Aˉ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学,读正版书好
返回《导引》

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值