随机事件与样本空间:集合定义、事件域与古典概型
1. 一道让我印象深刻的"送分题"翻车现场
几年前帮一批准备考试的同学梳理概率论,我出了一道自认为闭眼都能答对的题:袋子里3个红球2个白球,一次摸2个,设A="至少摸到1个白球",B="至少摸到1个红球",问A和B是什么关系。教室里安静了十几秒,然后有人答"互斥",有人答"对立",还有人认真地算了半天概率说"这两个事件概率都挺大的,应该不互斥吧"。
这题的正确回答是:A和B既不互斥也不对立,它们可以同时发生,比如摸到一红一白。就这么一个不需要任何计算的判断题,栽了一大片。问题出在哪儿?不是算错了,而是很多人脑子里的"随机事件"还是那个中学语文意义上的"事情",而不是一个可以取交、取并、取补的集合。你把事件当"事情",就会本能地去想"这两件事能不能一起发生";你把事件当集合,就会本能地去写A∩B到底是不是空集,一目了然。
这也是我特别想把"随机事件及其定义"这个话题单独拎出来讲的原因。绝大多数概率教材把它当成两页纸的铺垫,匆匆带过就直接进排列组合和古典概型,结果后面所有公式——加法公式、乘法公式、全概率、贝叶斯——全都建立在"事件是集合"这个地基上。地基没夯实的直接后果是:公式会背,题一变就懵。这篇内容我打算把随机试验、样本空间、随机事件的形式化定义、事件的四种关系与三种运算、事件域这个东西到底为什么存在、古典概型里定义如何落成数数、以及怎么用几行代码把抽象定义"跑"出来,一条线串下来。刚接触概率论的、准备各类考试的、以及做数据分析想补一下理论底的,都能对号入座。
2. 随机试验的三个硬指标:先把"可重复"这层说透
2.1 什么叫随机试验,为什么门槛这么高
教科书上给随机试验列了三条:可以在相同条件下重复进行;每次试验的可能结果不止一个,而且事先能明确所有可能结果;每次试验之前不能确定哪一个结果会出现。这三条我建议不要死记,要理解成三个"卡人"的门槛,每一条都在排除一类东西。
第一条排除的是不可重复的现象。"明天会不会下雨"严格来说不是随机试验,因为你没法把"今天"这个条件原封不动地再摆一遍。第二条排除的是结果说不清的现象,比如"某个人今天的心情",可能结果是什么你压根没法事先列全。第三条排除的是确定性现象,比如"在标准大气压下把水加热到100摄氏度会沸腾",结果虽然不止一个(沸腾或者不沸腾),但在这个条件下你事先就能确定,属于必然事件。
我见过不少同学在这一步产生一个误解:以为概率论只能处理"能反复做实验"的事。这是个要命的误解。随机试验只是初等概率论为了教学方便设立的模型,现代概率论早就改用概率空间那套公理体系(样本空间、事件域、概率测度三件套),完全不要求"可重复"。一条新闻明天上不上热搜,你没法重复实验,但你完全可以建一个概率模型去评估。所以"可重复"这一条,理解成"教学模型里的脚手架"就够了,别拿它当概率论的使用边界。
2.2 样本空间的书写纪律:三条不能破
样本空间记作Ω,就是一次试验所有可能结果组成的集合,里面的每个结果叫样本点,记作ω。写样本空间这件事看着简单,实际上是最容易埋雷的地方,我总结了三条必须守住的纪律。
第一条,穷尽。所有可能结果一个都不能漏。掷一枚骰子,Ω={1,2,3,4,5,6},你要是写成{1,2,3,4,5},后面所有概率都错,而且错得很隐蔽。
第二条,互斥。任意两个样本点不能同时出现。有人描述掷两枚硬币的结果时写成"两个正面、一正一反、两个反面",这个写法就违反了互斥性,因为"一正一反"其实包含了"先正后反"和"先反后正"两种情况,它不是一个样本点,而是一个事件。正确的写法是Ω={正正, 正反, 反正, 反反},四个样本点,粒度一致。
第三条,粒度一致。同一个样本空间里,样本点应该是同一个层级的东西。还是上面那个例子,"一正一反"和"正正"混在一起,一个粗一个细,这个空间就没法用了。
2.3 一个被教材一句话带过的关键洞察:样本空间不唯一
这条我想单独强调。同一个随机试验,样本空间可以有多种取法,取决于你关心什么。掷两枚硬币,你可以取Ω={正正, 正反, 反正, 反反},四个样本点;你也可以只关心正面出现的次数,取Ω={0,1,2},三个样本点。这两个样本空间描述的是同一个物理过程,但它们是不同的数学模型。
为什么这件事重要?因为它直接决定了你后面算概率的难度。举个典型例子:从一批产品里抽3个,问"至少有一个次品"。如果你用"逐个抽、记录顺序"的方式取样本空间,样本点很多,算起来繁琐;如果你只用"次品个数"建模,样本点只有0、1、2、3四个。选样本空间本质上是在选坐标系,选得好,题就简单一半。但要注意,一旦换了样本空间,等可能性这个前提也得跟着重新检查——"0个次品"和"1个次品"显然不等可能,而"正正""正反""反正""反反"是等可能的。这一点后面讲古典概型时还会重点说。
3. 随机事件的形式化定义:它是集合,不是"发生的事情"
3.1 定义只有一句话,但信息量很大
设Ω是某个随机试验的样本空间,称Ω的子集A为随机事件,简称事件。当且仅当试验的结果ω∈A时,称事件A发生。
这句话拆开来有三层意思。第一层,事件的身份是集合,是样本空间的一个子集,仅此而已。第二层,"事件发生"这个听上去很玄的说法,被翻译成了一个赤裸裸的从属关系:试验结果这个元素,落没落进这个集合里。第三层,一个事件"发生"还是"不发生"是互斥且穷尽的,因为结果要么在A里,要么在A的补集里,没有第三种可能。
我特别想让读者记住第一层。为什么必须在脑子里把"事件"和"集合"划等号?因为只有集合才能做运算。你要表达"至少有一个发生",对应的就是并集;要表达"同时发生",对应的就是交集;要表达"不发生",对应的就是补集。反过来,如果你脑子里事件还是"事情",那"至少一个发生"和"恰好一个发生"这两句话,你会觉得差不多,但在集合语言里它们差了十万八千里。
3.2 三种必须认得的特殊事件
必然事件Ω。样本空间本身作为事件,它必然发生,因为任何结果都落在Ω里。掷骰子时"点数在1到6之间"就是必然事件,概率为1。
不可能事件∅。空集作为事件,它永远不发生,因为没有结果能落在空集里。掷骰子时"点数为7",在Ω={1,...,6}的模型下这个事件就是∅。
基本事件。只含一个样本点的单元素集合{ω}。例如{1}表示"掷出1点"。基本事件是最小粒度的事件,任何事件都可以写成若干基本事件的并。
这里有一个容易被糊弄过去的点:不可能事件∅是一个合法的事件,不是"没有事件"。它和"这个事件没有意义"是两回事。掷骰子出现7点,在这个样本空间里就是一个正正经经的事件,只是它的概率是0。这个认知在后面学连续型随机变量时至关重要——那时候会碰到大量"概率为0但不是不可能"的事件,比如在[0,1]区间上均匀取点,恰好取到0.5的概率是0,但它并不是不可能发生。要是你现在就把"概率为0"和"不可能"划等号,后面必然要返工。
3.3 为什么非要用集合语言,不能用大白话
有人可能会问,说人话不好吗,非要搞这么抽象。我的经验是:大白话在简单场景下够用,一到多事件复合的地方立刻崩。
举个具体的。掷两枚骰子,设A="至少一个6点",B="点数之和为7"。用大白话描述"至少一个6点且点数之和为7",你能说清楚,但稍微复杂一点,比如"至少一个6点,或者点数之和为7,但两者不能同时成立"——这句话你已经很难不打磕巴地写出来了,而用集合语言,它就是一个对称差A△B,一步到位。更别说后面还有德摩根律这种需要机械化推导的工具,靠语感是推不动的。
集合语言还有一个隐性好處:它让"计数"成为可能。既然事件是集合,那么事件包含多少个样本点就是一件可以数的事情,而概率在等可能模型下就等于"事件包含的样本点数除以样本空间样本点总数"。没有集合,就没有计数;没有计数,就没有古典概型。这条逻辑链是整个初等概率论的骨架。
4. 四种关系与三种运算:把"且、或、非"翻译成集合
4.1 包含与相等:最容易但也不能掉以轻心
A⊂B的意思是:A发生则B必然发生。掷一枚骰子,A={2},B={2,4,6},A发生,B一定发生,所以A⊂B。反过来不成立,掷出4点,B发生了但A没发生。
A=B就是互相包含,两个事件完全等价,只是描述角度不同。比如"掷出偶数点"和"掷出的点数能被2整除",是两个说法,一个事件。
这部分不难,但有个应用场景值得提一句:证明两个事件相等,标准做法就是双向包含。后面学复杂事件的化简,这个套路会用很多次。
4.2 互斥与对立:一字之差,天壤之别
这是我认为整个初等概率论里混淆率最高的一个点,必须拿表格摆清楚。
| 对比维度 | 互斥(互不相容) | 对立(互逆) |
|---|---|---|
| 集合表示 | A∩B=∅ | A∩B=∅ 且 A∪B=Ω |
| 大白话 | 两者不能同时发生 | 不能同时发生,且必有一个发生 |
| 逻辑强度 | 较弱 | 较强,含互斥 |
| 关系 | 对立必互斥 | 互斥未必对立 |
| 掷骰子例子 | "掷出1点"与"掷出2点" | "掷出奇数点"与"掷出偶数点" |
| 概率关系 | P(A∪B)=P(A)+P(B) | P(A)+P(B)=1,P(B)=1-P(A) |
把握这张表的关键在于对立多了一条"必有一个发生"。掷出1点和掷出2点互斥,但还可以掷出3、4、5、6,所以它们不对立。而奇数点和偶数点,除了互斥之外,把整个样本空间占满了,所以对立。
再补一个容易被忽略的点:三个及以上的事件,两两互斥不等于完整划分。掷骰子,A={1,2},B={3,4},C={5},这三个事件两两互斥,但它们并起来是{1,2,3,4,5},把6漏了,所以不构成对立(在多个事件语境下叫"不构成完备事件组")。很多题在写全概率公式的完备事件组时,就是漏了这么一个尾巴。
4.3 并、交、差:三种运算的语义
并A∪B,语义是"至少有一个发生"。注意是"至少一个",不是"一个",两个都发生也算。
交A∩B,也写成AB,语义是"同时发生"。
差A−B,语义是"A发生而B不发生",它等于A∩B̄。
这三种运算本身不难,难的是把中文里的各种说法准确翻译过来。我整理了一张高频翻译对照表,这张表我建议直接抄在笔记首页:
| 中文表述 | 集合表达 |
|---|---|
| A、B至少一个发生 | A∪B |
| A、B都发生 | AB |
| A、B都不发生 | Ā∩B̄ = (A∪B)的补 |
| A、B不都发生 | (AB)的补 = Ā∪B̄ |
| A、B恰好一个发生 | (A∩B̄)∪(Ā∩B) = A△B |
| A发生而B不发生 | A−B = A∩B̄ |
| A、B至少一个不发生 | Ā∪B̄ = (AB)的补 |
最容易翻车的是"都不"和"不都"。"A、B都不发生"是两者同时不发生,用交集;"A、B不都发生"是"并非两者都发生",只要有一个没发生就成立,用并集。这两个说法只差一个字,集合表达差了一个德摩根律。我当年做题在这个坑里蹲了不止一次,后来养成一个习惯:看到中文里有"不"字,先判断这个"不"是管一个事件还是管整个复合事件,管整体的就先写成"(……)的补",再套德摩根律拆开。
4.4 德摩根律:为什么"非"进括号要换符号
德摩根律的两条形式:
- (A∪B)的补 = Ā∩B̄
- (A∩B)的补 = Ā∪B̄
用生活化的话讲:"不是(甲或乙)"等于"非甲且非乙";"不是(甲且乙)"等于"非甲或非乙"。
第一句拿个例子验证一下。周末安排是"去爬山或者去看电影",那么"周末安排没实现"是什么意思?意味着爬山没去成,并且电影也没看成,得两个都没做才算没实现,是"且"。第二句,"今天既刮风又下雨"这句话是假的,意味着什么?意味着要么没刮风,要么没下雨,只要有一个不成立,这句话就假了,是"或"。这么一想就很自然了。
德摩根律在化简复杂事件时是主力工具,尤其在处理"至少"和"至多"这类措辞时。"至少有1个次品"的补是"1个次品都没有"即"全是正品",用集合写就是:设Ai表示"第i个是次品","至少1个次品"=A1∪A2∪A3,其补就是Ā1∩Ā2∩Ā3。"至少"和"全都"是对立的,"全都"和"至少一个不"是对立的,这个对称关系最好刻在脑子里。
4.5 运算律:这套规则和小学的加减乘除是一路的
交换律、结合律、分配律在事件运算里全部成立,A∪B=B∪A,A(BC)=(AB)C,A(B∪C)=AB∪AC,这些和数字运算高度类似。但有一条数字运算里没有的:吸收律,A∪(AB)=A,A∩(A∪B)=A。这条初看有点怪,用集合的图景一想就通了:A和A的一部分并起来,结果还是A。
还有一条要特别注意:事件运算里没有"减法分配"这回事,因为集合差本质上是交补,按交并的规则走就行,别生造规则。我见过有人把(A−B)∪C展开成A∪C−B∪C,这就属于瞎套。
5. 事件域:为什么不是随便什么子集都能当事件
5.1 一个听上去很哲学的问题
前面说"事件是样本空间的子集",那么,是不是样本空间的任意子集都能当事件?在掷骰子这种有限样本空间里,答案是肯定的,Ω的任何一个子集都能被合理赋概率,因为总共就6个样本点,你随便挑一个子集出来,它包含2个点就是2/6,包含5个点就是5/6,清清楚楚。
但换成在区间[0,1]上均匀随机取一个数,情况就不一样了。这个样本空间有不可数无穷多个点,理论上它的子集数量更是天文数字。而数学上可以证明(这一步用到选择公理),在实数区间上存在一些"病态"子集,你没法给它自洽地分配一个概率,一分配就会推出矛盾。这不是我们不够聪明的问题,是逻辑上就不行。
5.2 事件域的三条封闭性要求
解决方案是:不追求给所有子集赋概率,只圈定一个"合法事件"的集合,只在这个圈子内部讨论概率。这个圈子就叫事件域,通常记作F,它是一个由Ω的子集组成的族,需要满足三条:
- Ω本身在F里,即Ω∈F;
- 若A∈F,则它的补集Ā也在F里,这叫对补运算封闭;
- 若A1、A2、A3……都在F里,则它们的可列并也在F里,这叫对可列并封闭。
由第1、2条能推出空集∅∈F,由德摩根律配合第2、3条能推出对可列交也封闭。这三条合起来,F就叫一个σ代数(西格玛代数)。
为什么要这三条?因为它们恰好保证了你在这个圈子里能做"非"和"或"的运算而不会跑到圈子外面去。既然概率论里所有复合事件都是靠补和并拼出来的,只要这个族对补和并可列封闭,剩下的一切运算都在里面自洽闭合,不会撞上那些病态子集。
5.3 一个不算完美但很好懂的类比
把小区里所有住户看成一个样本空间。物业想做统计,关心的是"某户今天家里有没有人"。为了统计能自洽,物业必须能够回答三类问题:整个小区的状态是什么(Ω);某户有人,那么该户没人的状态也得能讨论(补);这一栋楼里至少有一户有人,这个状态也得能讨论(并)。这三类问题能覆盖的组合,就构成了物业实际能够讨论的"合法事件域"。那些超出这个范围的、没法用"有人/没人"组合描述的奇葩集合,物业不给它赋概率,也不影响日常运营。
5.4 三件套合体:概率空间
样本空间Ω、事件域F、概率测度P,三者合起来记作(Ω, F, P),就是现代概率论的标准框架,这叫概率空间。P的定义也很有意思,它是一个从F映射到[0,1]的函数,满足P(Ω)=1和可列可加性。
多数入门教材只讲Ω和P,把F悄悄藏起来,取成幂集。这在有限样本空间下完全没问题,不影响你答题。但知道有F这个东西存在,能帮你解释两件事:一是为什么概率论里总强调"事件"要有明确的可测性,二是为什么有些看似自然的表述其实不合法。我个人的建议是:考试阶段照着教材走就行,别陷进去;但如果你后面要读测度论方向或者搞理论,这一层越早建立越好。
6. 古典概型:定义如何落成"数数"
6.1 两个前提缺一不可
古典概型的公式是P(A)=A包含的样本点数/Ω中样本点总数,写起来极简,但它的适用条件是两个硬前提:样本空间有限,且每个样本点等可能。这两条少一条,公式立刻失效。
第一条好判断。第二条才是隐蔽杀手。前面提过的"抽3个产品看次品个数"那个样本空间{0,1,2,3},它满足第一条,但绝对不满足第二条——三个产品里出现0个次品的概率和出现1个次品的概率显然差很远。这时候你如果直接套公式,答案一定错。所以用古典概型之前的第一个动作,永远是检查你选的样本空间里,样本点是不是等可能的。
6.2 分母和分子必须用同一套计数方式
这是我最想强调的实操纪律。算古典概型,分子和分母是两个计数,这两个计数必须建立在同一个样本空间上。具体说,如果分母按组合数算(不考虑顺序),分子也必须按组合数算;如果分母按排列数算(考虑顺序),分子也必须按排列数算。
回到开头那道题。袋中3红2白,任取2个球,求"至少摸到1个白球"的概率。
按组合方式:分母C(5,2)=10。"至少1白"=恰好1白+恰好2白=C(2,1)×C(3,1)+C(2,2)=6+1=7,所以P=7/10。
按排列方式:分母A(5,2)=20。"至少1白"的算起来稍繁,可以走对立事件:两个都是红球=A(3,2)=6,所以P=1−6/20=14/20=7/10。两个结果一致,这就是正确的做法。
错误做法长什么样?分母写C(5,2)=10,分子写"恰好1白"的时候用了排列A(2,1)×A(3,1)=6,再除以10,得0.6,完全错。分子分母不是同一个样本空间里的计数,加起来毫无意义。
6.3 "正难则反":省一半事的技巧
"至少"、"至多"、"不全"这类字眼,直接算往往要拆成一堆情况相加,走对立事件通常一步到位。上面那道题就是典型:直接算要分"恰好1白"和"恰好2白"两种情况,走对立只要算"全是红球"一种。
再举个掷骰子的。掷两枚骰子,求"至少一个6点"的概率。直接算要考虑"第一个6第二个不是""第二个6第一个不是""两个都是6",容易重复计数。走对立:"两个都不是6点"有5×5=25种,总共有36种,所以P=1−25/36=11/36。"至少"的对立是"一个都没有",这是条件反射级的反应,建议练到不用想。
6.4 频率与概率:一个实验值,一个模型值
还有一对概念必须分清。频率是你在真实或模拟实验里数出来的比值,会随每次实验波动;概率是模型里算出来的理论值,固定不变。掷一万次硬币,正面频率可能是0.5042,再做一万次可能是0.4987,而正面概率始终是0.5。
那为什么我们信频率能逼近概率?这是大数定律的内容,直观地说,随着试验次数增加,频率在概率附近的波动幅度会越来越小。注意"逼近"这个词的严谨含义:它不是"当次数趋于无穷时频率这个数列的极限等于概率"这么朴素的说法,而是"频率与概率之差的绝对值超过任意小正数的概率趋于0"。后者叫依概率收敛。中学阶段通常不追究这个区别,但如果你准备往深了走,最好从一开头就别把它记成朴素的数列极限,省的以后纠正。
7. 用几行代码把事件运算和概率跑一遍
抽象定义看再多遍,也不如亲手跑一遍来得实在。这一节给几段可以复制即用的代码,用Python把前面那些概念落地。
7.1 用集合类型直接表达事件
Python的set天然支持并、交、差,和事件运算几乎一一对应。
Omega = {1, 2, 3, 4, 5, 6} A = {2, 4, 6} # 掷出偶数点 B = {1, 2, 3} # 掷出的点数不超过3 print("并(至少一个发生):", A | B) print("交(同时发生):", A & B) print("差(A发生而B不发生):", A - B) print("A的对立事件:", Omega - A) print("是否互斥:", (A & B) == set()) print("是否对立:", (A & B) == set() and (A | B) == Omega)跑出来的结果里,"是否对立"那行会打印False,因为A∪B={1,2,3,4,6},漏了5,不是整个Ω。这行输出比任何文字解释都更能说明"互斥但不对立"到底是什么意思。
7.2 验证德摩根律
def complement(S, Omega): return Omega - S left = complement(A | B, Omega) right = complement(A, Omega) & complement(B, Omega) print("(A∪B)的补 =", left, " Ā∩B̄ =", right, " 相等:", left == right) left2 = complement(A & B, Omega) right2 = complement(A, Omega) | complement(B, Omega) print("(A∩B)的补 =", left2, " Ā∪B̄ =", right2, " 相等:", left2 == right2)两行都会打印True。建议自己改几个A、B的定义再跑跑,跑上十几遍,德摩根律就不会再记错了。
7.3 蒙特卡洛模拟:让频率去逼近概率
用随机模拟验证前面那道摸球题的答案7/10。
import random def one_experiment(): balls = ['红', '红', '红', '白', '白'] picked = random.sample(balls, 2) # 不放回抽2个 return '白' in picked random.seed(20240501) for n in [10, 100, 1000, 10000, 100000]: hits = sum(one_experiment() for _ in range(n)) print(f"试验 {n:>6} 次,频率 = {hits / n:.4f}")跑下来你会看到频率从0.6、0.72、0.697、0.701、0.6998这样一路抖动着往0.7靠。这个抖动过程本身就是最好的教材:n=10的时候偏差可以到0.1以上,n=10万的时候基本稳定在千分位以内。这也是为什么小样本实验的结论往往靠不住——不是方法错,是样本量不够。
7.4 顺手算个反直觉的例子
生日问题:一群人里至少有两个人生日相同的概率。这个问题的"反直觉"恰恰来自样本空间的选择——绝大多数人第一反应是拿人数除以365,实际样本空间是365的n次方,对立事件是"所有人不同"。
from math import prod def birthday_prob(n): if n > 365: return 1.0 p_all_diff = prod((365 - i) for i in range(n)) / (365 ** n) return 1 - p_all_diff for n in [10, 20, 23, 30, 50]: print(f"{n} 人,至少两人生日相同的概率 = {birthday_prob(n):.4f}")n=23的时候结果约0.5073,过半数。这个例子说明一件事:样本空间选错,直觉就跟着错。人的直觉擅长判断"某个人和我同生日",不擅长判断"任意两个人之间",而后者才是这个问题的样本空间真正在数的东西。
8. 我反复见到的六种理解偏差及纠正方式
这些年下来,下面这六条几乎是必踩的,我按出现频率排个序,附上纠正思路。
| 编号 | 常见偏差 | 纠正方式 |
|---|---|---|
| 1 | 把"事件"和"样本点"混为一谈 | 牢记事件是子集{ω}或更大,样本点是元素ω |
| 2 | 样本空间漏结果 | 写完Ω后反向检查:有没有哪种情况放不进去 |
| 3 | 互斥当对立 | 加一步检查:A∪B是不是等于Ω |
| 4 | "都不"与"不都"分不清 | 先判断"不"管的是单个事件还是整体,管整体先写补再拆德摩根 |
| 5 | 古典概型不看等可能前提 | 套公式前必须确认样本点等可能,尤其是自造样本空间时 |
| 6 | 认为P(A)=0则A=∅ | 记住连续型情形下大量"概率为0但可能发生"的事件 |
前三条靠反复训练就能改,第四条建议用前面那张中文-集合对照表强制翻译,写题时先做一步"翻译"再动笔,别跳。第五条在自造样本空间时最危险,我的个人习惯是:每造一个样本空间,先拿两个不同的样本点,问自己"这两者的可能性真的一样吗",答不上来就换一种建模方式。
第六条是我最想多啰嗦两句的。它跟随机事件的定义直接挂钩:不可能事件是空集∅,这是一个集合身份的判断;概率为0是一个测度身份的判断,两者不是一回事。在有限等可能模型下它们恰好重合,所以初学者容易建立错误等式。一旦进入连续场景,比如在[0,1]上均匀取点,取到某个具体数值的概率是0,但这个事件{0.5}显然不是空集,它是实实在在可以发生的。把这个区分提前建立好,后面学连续型随机变量会顺畅很多。
另外补一个操作层面的小建议:学这一章的时候,最好拿一张纸把样本空间、事件、事件运算三者的关系画成一个三层结构——最底层是样本点,中间层是事件(子集),最上层是事件域(子集的集合)。三层各自的身份不要串。很多人后面在条件概率那里迷路,追根溯源,是这三层的边界在脑子里本来就是糊的。
最后分享一个我自己一直在用的小办法:遇到任何一道概率题,动笔算之前,先用一句话把样本空间写出来,再用一句话把要求的事件写成样本空间的子集。这两句话写不出来,说明概念还没通,算下去一定是白算。