CS109 Probability Theory 课程笔记 Counting Lecture计数原理(一、二)

什么是计数?

说白了就是1、2、3这样数数,说得专业一点就是对事件数量进行统计,关键是数什么,怎么数。

数什么?

我们数的是试验进行的次数以及试验的结果——即事件。下面简单介绍一些基本概念:
  • 随机试验:在相同条件下可以重复进行,每次实验结果无法预知,但所有可能的结果都事先已知的试验。习惯用E表示。
  • 随机事件:随机试验中可能发生也可能不发生的事件。通常用字母A、B、C表示。
  • 基本事件:随机试验E中可能出现的每一个结果。
  • 样本空间:随机试验E可能出现的全部结果组成的集合,用字母Ω表示;组成样本空间Ω的元素成为样本点(即基本事件),用字母 ω表示。
  • 必然事件:将·Ω看作一个随机事件,由于每次试验必有Ω中的一个样本点发生,所以Ω是必然事件。
  • 不可能事件:将空集∅看作一个事件,由于每次实验∅都不会发生,所以∅是不可能事件。
//举个栗子~
小明同学投骰子   (随机事件E),观察正面朝上的点数。
 ①样本点(基本事件):点数为1、2、3、4、5、6(共有6个样本点);
 ②样本空间:Ω={1,2,3,4,5,6};
 ③随机事件:A={点数为7}、B={点数为3的倍数}、......;
 ④不可能事件:∅={点数大于7}等。

怎么数?(计数规则)

一、分步相乘 “and”

如果一个试验有两步:第一步的结果来自集合A,|A|=m;第二步的结果来自集合B,|B|=n,且|B|不会被第一步的结果影响,那么此试验的结果数目为
|A||B|=mn 。
条件:A的选择不会改变在B中有多少选择
//举个栗子~
e.g.一个由12个像素组成的图片,有多少种不同的色彩搭配情况?
                                          图1.12个像素组成一个图片
应用“分步相乘”法,我们首先将其拆为若干steps:
  1. 每个像素有几种颜色:已知每个像素的颜色由红、绿、蓝三个通道确定;每个通道由一个8位的二进制01串确定,即有28=256种;那么一个像素的颜色便有256³≈17百万种。
  2. 选择第一个像素的颜色,|A|≈17百万种;
  3. 选择第二个像素的颜色,|B|≈17百万种;
  4. ......
  5. 选择第十二个像素的颜色,|X|≈17百万种;
因此,共用17百万12  ≈5.8×1077 。(该数量几乎与目前已知的宇宙中的原子数一样多

二、分类求和 “or”

如果一个试验的结果可分为集合A和集合B,|A|=m,|B|=n,且A∩B有可能不是空集,那么试验结果总数N=|A|+|B|-|A∩B|。(老容斥原理了)
//举个栗子~
桌子上有蔬菜和水果两类食物。水果有苹果、鸭梨、香蕉、柿子;蔬菜有萝卜、土豆、柿子(没错就是刚刚水果里提到的那种柿子,不要抬杠 手动Doge),那么一共有4+3-1=6种食材。
               图2.等等,这图里好像没有蔬菜......

*思考题

Q1 在6位的01字符串 ,以“01”开始或者以“10”结束的字符串有多少?
 解:计集合A={以“01”开始的字符串},B={以“10”结束的字符串}
|A|=24=16;|B|=24=16;|A∩B|=2²=4,
故,N=|A|+|B|-|A∩B|=16+16-4=28种。
                                     图3.不信的话可以数数(手动Doge)
Q2 我们大家都爱喝珍珠奶茶,里面的BOBA(音译为波霸)Q弹香甜。那么请问 BOBA这四个字母排列组合,有多少种不同的情况?
解:(枚举,部分组合,插板等方法均可)我们假设两个B不同,不妨设为B1,B2,那么共有A44=4!=24种;但实际上...B1...B2...与...B2...B1...是同样的(...B...B...),所以将之前的情况砍半,最终结果为 A 4 4/2=12种。
这种方法实际上属于分步计数的逆用。
或代码法(手动滑稽)
import itertools
def main():
    letters = ['b','o','b','a']
    perms = set(itertools.permutations(letters))
    for perm in perms:
        pretty_perm = "".join(perm)
        print(pretty_perm)
                    图4.BOBA milk tea !(^-^)!

三、A Permutation(排列)

is an ordered arrangement of subjects.
//factorial(阶乘)的代码
import math
def main():
    n = math.factorial(4)
    d = math.factorial(2)
    print(n/d)

e.g.有一个手机的锁屏密码为六位,通过观察指纹发现了5个相关数字,问密码有多少种可能?

解:step1:根据抽屉原理,必有一个数字重复用了两次,选择一个重复了两次的数字;
       step2:将两个重复的数字视为不同的,并将六个数字进行排列;
       step3:由于两个数字实际上是相同的,所以交换前后顺序其实是一种密码,故将总数砍半(原理同"BOBA")。
       故,根据分步相乘原理,结果为5*6!/2 。

四、A Combination(组合)

is an unordered selection of k objects from a set  of n distinct objects.
//举个栗子~
n人分k个同样的蛋糕,有多少种情况捏?
  1. 将n个人进行编号,有n!种可能;
  2. 将0 ~(k-1)号请出列,给他们发蛋糕;
  3. 由于蛋糕是相同的,故与顺序无关,即0 ~(k-1)号可以任意排序而属于同一种顺序,故总数除以k!;
  4. 由于剩下(n-k)人都没分到蛋糕,故也与顺序无关,即这(n-k)个人可以任意排序而属于同一种情况,故总数除以(n-k)!;
  5. 最终结果为n!/k!(n-k)! 。
                                               图5.我喜欢那个巧克力的
整体看下来,与“BOBA”的原理是相同的,本质思想都是先特殊化,将组合问题转化为排列问题,然后再去特殊化使问题复原。
这便是Cnk =n!/k!(n-k)! 的原理。
//52张扑克牌中选五张牌
def main():
    cards = make_deck()
    all_hands = itertools.combinations(cards,5)
    for hand in all_hands:
        print(hand)
def main():
    total = math.comb(52,5)
    print(total)

*插板法

针对相同物体分入不同筐的情况而产生的一类问题。

//举个栗子~

现在有n相同的书,分给k个人,问有几种分发?
  1. 首先我们拿来(k-1)块板子,将书分成k堆;
  2. 然后我们把板子也看作不同的“书”,进行排列,共有(n+k)! 种情况;
  3. 由于板子是相同的,故除以(k-1)!;
  4. 由于书是相同的,故除以n!;
总结下来就是,在萝卜相同筐不同的情况下,设 板数=筐数-1 ; (萝卜+板)!/萝卜!*板数!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值