zoukankan      html  css  js  c++  java
  • 常见概率题类型总结

    此类问题主要有期望题,随机数题、以及概率题,观察者掌握的信息多少会影响到最终的概率。影响样本空间的大小。

     期望题关键: 找出概率递推公式

     随机数题关键: 关键在于保证每个随机数出现的概率相等(洗牌算法)

    一 抛硬币问题总结:

      问题1 : 两个人轮流抛硬币,规定第一个抛出正面的人可以吃到苹果,请问先抛的人能吃到苹果的概率多大?(伯努利分布)

            这个题是否 某国家非常重男轻女,若一户人家生了一个女孩,便再要一个,直到生下男孩为止,假设生男生女概率相等,请问平均每户人家有________个女孩?,这个问题具有一定的类似性呢?

            一个样本空间为反反...正,一个样本空间为女女女....男

        第一种方法:p=1/2+1/2^3+1/2^5+........=2/3

             第二种:先抛的人吃到苹果的概率为p1,后抛的人p2若想吃到,只能在第一个人抛反面下才可能,所以样本空间突然少了一半,所以p2=1/2p1,所以p1=2/3。

             第三种:先抛为p,为反后继续抛,吃到的概率还是p,所以其实p=1/2(正)+1/2(反)*p,解得p=2/3

             第四种: 我首先想到的就是把 第一次抛到正面的概率 + 第二次抛到的概率 + …..+无穷多次,当然后面的概率几乎为0了。    结果就是  P = 1/2 + 1/8 + 1/32+ ……  最后的结果就是 P = 2/3 . 这个计算也不难,其实就是等比数列,比为1/4.  简单的无穷级数 (1/2) / (1-1/4) = 2/3.    1/(1-x)^2=1+2x+3x^2+4x^3+5x^4+… (-1<x<1)

    还有一个别人的分析:给所有的抛硬币操作从1开始编号,显然先手者只可能在奇数(1,3,5,7…)次抛硬币得到苹果,而后手只可能在偶数次(2,4,6,8…)抛硬币得到苹果。设先手者得到苹果的概率为p,第1次抛硬币得到苹果的概率为1/2,在第3次(3,5,7…)以后得到苹果的概率为p/4(这是因为这种只有在第1次和第2次抛硬币都没有抛到正面(概率为1/4=1/2*1/2)的时候才有可能发生,而且此时先手者在此面临和开始相同的局面)。所以可以列出等式p=1/2+p/4,p=2/3。

             第五种: ,i表示先抛的人一共抛了的次数,上面的式子可以求出,P(A)=2/3

           问题2:连续扔硬币,直到 某一人获胜,A获胜条件是先正后反,B获胜是出现连续两次反面,问AB游戏时A获胜概率是?

             其实只要出现了正面,A就早晚能赢,所以B获胜的概率只有那一次,反反:1/4,所以A获胜的概率为3//4。

           问题3:  小a和小b一起玩一个游戏,两个人一起抛掷一枚硬币,正面为H,反面为T。两个人把抛到的结果写成一个序列。如果出现HHT则小a获胜,游戏结束。如果HTT出现则小b获胜。小a想问一下他获胜的概率是多少?

             解法1 :   首先,如果第一次抛出了T,那么其实就根没抛过是一回事,后面怎么继续都相当于重来了。所以p=1/2p+p(h)

               如果抛出了H,如果上半部分,只能是A赢,下半部分出现T的时候,再出现H又相当于重新来了。

               所以B赢的概率为1/4,再从下面H重新出发的1/4,也就是pb=1/4+1/4^2+1/4^3……,就是1/3,所以A赢的概率为2/3。

        解法2: 随机过程中的First Step Analysis,设P_s表示状态为s时'HHT'发生的概率。显然我们有P_HHT=1以及P_HTT=0。状态转移图如下:


    Nill表示还没有抛时的状态,这时有1/2的概率变成H还有1/2的概率变成T,变成T时相当于又回到Nill。
    我们要求的即P_Nill。
    由状态转移图,可以列出式子:
    P_Nill = 1/2*P_Nill + 1/2*P_H
    P_H = 1/2*P_HH + 1/2 * P_HT
    P_HH = 1/2*P_HH + 1/2*P_HHT
    P_HT = 1/2*P_H + 1/2*P_HTT
    p_HHT = 1
    P_HTT = 0
    最后可以解得 P_Nill = 2/3。
               解法3: 假设b赢得概率为p;则有两种情况:H,T,T;H,T,H...;第一种情况概率为;第二种情况为,因为第二种情况H出现后就相当于又回到开始状态了,这是小b获胜概率仍为p;所以有等式;可解出p;然后1-p即为所求。
             解法4:   a赢的概率有三种情况:
                1. 出现HHT, HHHT, H...HT,该情况的概率为p1=1/8+1/8*1/2+1/8*1/2*1/2+...=1/4
                2. 出现连续HT再出现第一种情况,即(HT...HT)( H...HT),该情况的概率为p2=1/4*1/4+1/4*1/4*1/4+...=1/12
                3. 出现连续的T再出现第一或者第二种情况,即(T...T) (HT...HT)( H...HT),该情况的概率为p3=1/3*1/2+1/3*1/2*1/2+...=1/3
                a赢的概率为pa=p1+p2+p3=2/3
         问题4: A和B2人投硬币,正面A得1元,反面B得一元.起始时A有1元,B有100元. 游戏持续进行,直到其中1人破产才终止

                  问:1.如果硬币正反概率相同,游戏的期待长度(expected duration)是几次投掷?

                      2.如果硬币是不公正的,正面概率为P,反面概率为Q.(P+Q=1), 那么游戏的期待长度(expectedduration)是几次投掷?

          问题5: 游戏规则为,连续2次抛到硬币朝上,则游戏结束。问平均抛多少次游戏可以结束?

             平均抛多少次,即是求问题的期望。

            首先先抛一枚硬币,如果是花,那么需要重头开始;如果是字,那么再抛一枚硬币,新抛的这枚如果也是字,则游戏结束,如果是花,那么又需要重头开始。根据这个过程,设抛硬币的期望次数为T,可以得到关系:

             T = 1/2(1 + T) + 1/2(1 + 1/2(1+0) + 1/2(1+T)), 得出 T = 6 

         问题6: 连续抛 k 次朝上的解法:

      假设连续k次正面朝上的期望为Ek,在连续出现k次正面朝上后,下次一也为正面的期望为, E(k+1) = 1/2 (Ek + 1) + 1/2(Ek + 1 + E(k+1)),推到出公式 (E(k+1) +2) /(Ek +2) = 2 得出 Ek = 2^(k+1) -2

         问题7: 抛一个六面的色子,连续抛直到抛到6为止,问期望的抛的次数是多少?

      设期望次数为E,那么有:
      [1]1次抛出6的概率为1/6,那么期望次数为1*1/6
      [2]本次抛出非6数字的概率为5/6,因为没有抛出6,因此期待抛出6还需要执行试验的次数仍为E,需要注意加上本次(1次)失效的抛掷,即期望次数为(1+E)(5/6)

      综合可得:
      E = 1*(1/6) + (1+E)(5/6)

      解得: E = 6

        问题8: 若要使骰子(六个面)的每个数都出现至少一次,那么平均需要掷多少次骰子?即求掷骰子次数的期望

      与前一题类似,设掷出第i个数需要抛掷的次数为E(i),i=1,2,3,4,5,6,(需要注意的是第i个数是值之前没有出现过的数字,而不是具体的值)
      那么E(i)可由两部分组成:
      E(i) = (i/6)(E(i)+1) + (1-i/6)(E(i+1)+1)

      [1] (i/6)(E(i)+1) : 已经有i个数字出现了,那么当前抛掷出重复数字的概率为 i/6,状态仍然是E(i),加上当前实验1次
      [2] (1-i/6)(E(i+1)+1) : 已经有i个数字出现了,那么当前抛掷出新数字的概率为 1-i/6,状态转移到E(i+1),即当抛掷出了i+1个数字后,仍需要抛掷次数的期望,别忘加当前试验 1 次

      E(i) = E(i+1) + 6/(6-i), E(6) = 0

      E(0) = 6/6 + 6/(6-1) + ... + 6/1 + 0

         参考链接:https://www.cnblogs.com/fanling999/p/6777335.html

     二 开箱子总结:

     问题1 : 有一个箱子,N把钥匙,只有一把钥匙能打开箱子,现在拿钥匙去看箱子。问恰好第k次打开箱子的概率?

    第k次打开的概率=frac{N-1}{N}*frac{N-2}{N-1}*cdot cdot cdot *frac{N-k}{N-k+1}*frac{1}{N-k}=frac{1}{N}

    三 生孩子问题总结

     问题1 : 某国家非常重男轻女,若一户人家生了一个女孩,便再要一个,直到生下男孩为止,假设生男生女概率相等,请问平均每户人家有________个女孩。

        解法1: 首次成功的概率为(1-p)^{k}*p,也就是首次出现男孩的概率,那么发生的次数也就是孩子的个数服从几何分布,则期望为2,所以女孩是1个。

        解法2:  一个国家人们只想要男孩,每个家庭都会一直要孩子,只到他们得到一个男孩。如果生的是女孩,他们就会再生一个。如果生了男孩,就不再生了。那么,这个国家里男女比例如何?

            分析:一开始想当然的以为男多女少,毕竟都想要男孩。但是注意这句话“如果生了男孩,就不再生了”,一个家庭可能有多个女孩,只有一个男孩。

    再仔细分析,我们来计算期望值,只用计算一个家庭就行了。设一个家庭男孩个数的期望值为S1,女孩为S2. 。根据题目条件,男孩的个数期望值S1=1这个是不用计算了。主要计算S2

    一个家庭的孩子数量可以为:1,2,3,4,5…..  对应的的男女分布为: “男”,”女男”,”女女男”,”女女女男”,”女女女女男”…  

    对应的概率分布为 1/2, 1/4, 1/8, 1/16, 1/32 。其中女孩的个数分别为 0,1,2,3,4……

    因此 S2=0*1/2 + 1*1/4 + 2*1/8 + 3*1/16 + 4*1/32 + ………

    可以按照题目2用级数求,也可以用错位相减法:S2=1/4+2/8+3/16+4/32+…  两边乘以2,得: 2*S2=1/2+2/4+3/8+4/16+5/32+..

    两个式子相减得 S2=1/2+1/4+1/8+1/16+1/32+…=1. 所以期望值都为1,男女比例是一样的。

     问题2: 老王有两个孩子,已知至少有一个孩子是在星期二出生的男孩。问:两个孩子都是男孩的概率是多大?参考链接:https://blog.csdn.net/midailaoqi/article/details/82876207

     参考链接: 

       https://blog.csdn.net/u012662688/article/details/52813387

       https://www.nowcoder.com/questionTerminal/030b183f37fd41f7ad4486f56f5ec355?source=relative   
       https://blog.oldj.net/2010/08/21/the-tuesday-boy-problem-2/
      解法1: 传递的理念:观察者掌握的信息多少会影响到最终的概率。
    若题目变为已知生的第一个孩子是男孩,问两个孩子都是男孩的概率是多大?则选C
    但此题的已知条件是至少有一个孩子是在星期二出生的男孩,隐含的信息是知道两个孩子的性别和出生日期信息。若不加限制条件,第一个孩子有14种可能(性别2种*周几7种),第二个孩子同样,总样本空间应为142=196。但加了限制条件后,样本空间就变少了很多。第一个孩子是男周二,第二个孩子任意,有14种情况;同理第二个孩子是男周二,第一个孩子任意,也有14种情况,但两个孩子均为男周二的多算了一次,所以样本空间为14+14-1=27;同理,在容量为27的样本空间中,两个孩子都是男孩的有7+7-1=13;所以最后的概率是13/27。
    解法2: 贝叶斯公式,设A表示“至少有一个孩子是在星期二出生的男孩”,B表示“两个孩子都是男孩”,根据贝叶斯公式P(B|A)=P(B)*P(A|B)/P(A), 易知P(B)=1/4,P(A)不太好求,借助上面第一种方法的分析可以知道P(A)=27/196,而P(A|B)即在两个孩子都是男孩的情况下(7*7=49种情况)至少有一个孩子是在星期二出生的男孩的概率可以通过1-两个男孩都不是在星期二出生的概率(6*6/49)计算,为13/49,最后带入贝叶斯公式即可得到13/27。
     参考链接: https://blog.oldj.net/2010/08/21/the-tuesday-boy-problem-2/https://blog.oldj.net/2010/08/21/the-tuesday-boy-problem-2/
     问题3:有一对夫妇,先后生了两个孩子,其中一个孩子是女孩,问另一个孩子是男孩的概率是多大?

    答案是2/3.两个孩子的性别有以下四种可能:(男男)(男女)(女男)(女女),其中一个是女孩,就排除了(男男),还剩三种情况。其中另一个是男孩的占了两种,2/3. 之所以答案不是1/2是因为女孩到底是第一个生的还是第二个生的是不确定的。

    参考链接:
    https://blog.csdn.net/ymyss4/article/details/11845523
    四 错排问题总结:

    问题: 大家都在排队上飞机,然后金刚来了,他也有票,但是插队第一个上了飞机,随便找了个座位坐下了,其余人的策略是:

    如果自己票上写的座位没被占就按照座位坐,被占了就变身成金刚,随便找地儿坐。问第i个人坐在自己座位的概率是多少?

    1..n一共n个座位,为了方便计算起见,我们做一个变换

    变换1:金刚的票上的座位是最后一个,也就是第n个,其余人的票和座位再按照原先的顺序排列成1..n-1。

    这样并不影响最终的概率,因为如果

    1)金刚坐在自己的位置上,那么大家同样都是肯定坐在自己的位置上。

    2)如果金刚坐在第i个位置(非他票上的座位)上,那么前i-1个人会坐在自己的位置上,与变换前相同,而第i个人肯定不会坐在自己的位置上,他会在变换前的金刚的座位再加上i+1..n的集合中随机挑一个座位,这也有变换前相同,他挑的座位对于后面人的影响也是与变换前相同的。

    设F(i,n)为新的n个座位的排列中第i个人坐到自己位置上的概率,那么旧排列中第i个人坐到自己位置的概率就是

    F(i,n) i<j;

    F(i-1,n) i>j;

    j为金刚票上的座位

    那么我们现在来计算F(i,n),后面的讨论全部基于变换后的排列。

    对于乘客i,金刚的选择会造成3种情况,假设金刚选择的是j,分别为i<j,i=j,i>j,概率分别为(n-i)/n,1/n,(i-1)/n。

    如果i<j,即金刚选择的座位在i的后面(我们做变换1的目的就在于此,如果不做那么还要考虑金刚坐到自己的位置的情况,而他自己的位置却是不确定的),那么乘客i必然会坐到自己的位置,概率为1,(n-i)/n*1

    如果i=j,概率为0

    如果i>j,那么前j-1个人肯定坐在自己的位置上,而第j个人就变身成了金刚,这样可以看做他就是金刚,他原来的座位就是n。

    变换2:前j-1个人是打酱油的,跟后面的事件无关了,因为金刚在j上,所以第j个人变成了金刚2,他的票号是最后一个,j+1..n-1号乘客成了新的受害者,将j+1..n-1从1开始重新编号,座位数变成n-j

    故第i个人坐在原来座位的概率为F(i-j,n-j)

    所以概率为

    综上

    最后的结果是

    F(i,n) i<j;

    F(i-1,n) i>j;

    j为金刚票上的座位

     五 求期望问题总结:

       问题1 :一个木桶里面有M个白球,每分钟从桶中随机取出一个球涂成红色(无论白或红都涂红)再放回,问将桶中球全部涂红的期望时间是多少?  

    解法1:

    在M个球中取到第1个未着色的取得次数期望是:1

    在M个球中取到第2个未着色的取得次数期望是:1/(M-1/M)   ---- 这就是用题目2的模型得出的期望,就像抛色子(只有两色),第一个着色的点数为1,其它所有未着色的是点数为2。

    在M个球中取到第3个未着色的取得次数期望是:1/(M-2/M)

    ...

    在M个球中取到第M个未作色的求所需要的取得次数的期望是:1/(1/M)

    整体次数的期望就是 1+ 1/(M-1/M)+1/(M-2/M)+...+M

    解法2:

    数学期望类的题目,主要是要理解什么是数学期望,数学期望是干什么用的,关于这些问题的解答,大家可以自己去理解,思考或者翻书,我要讲的内容是如何利用这些数学期望的特点。

    数学期望的递归特性:

    飞行棋大家都玩过吧,应该知道每次抛到6,就有一架飞机可以出门了,那么问你一架飞机可以出门的时候,抛筛子次数的数学期望是多少?

    你估计会毫不犹豫的说是6(P=1/6,E=1/P=6),但是你思考过深一层次的原因吗?

    好吧,我来告诉你,我们记抛6的期望次数是E,如果第一次抛的是6,那么就是1次,概率是1/6;如果第一次不是6呢,那么次数是1+E,概率为5/6;

    那么 E = 1 * (1/6) + (1+E) * (5/6),你可以很容易的解出 E = 6

    上面加粗的红色字体用的就是类似一个递归的概念,希望你能理解吧,不行的话,那只能自己去努力理解了,呵呵。

    现在我们开始解答上面的问题:

    令P[i]代表M个球中已经有i个球是红色后,还需要的时间期望,去将所有球都变成红色。

    So,给出递归式:P[i]= (i/M) * P[i] + (1-i/M)* P[i+1] + 1

    我相信大家都能理解这个公式的含义,不过还是解释一下,在P[i]的情况下,我们选一次球,如果是红球,那么概率是i/M,子问题还是P[i],如果是白球,那么概率是1-i/M,子问题是P[i+1],注意你当前的选球操作要计算在内,即一次

    化简如上递归式得:P[i] = P[i+1] + M/(M-i),显然P[M] = 0;

    所以:

    P[M-1] = P[M] + M/1

    P[M-2] = P[M-1] + M/2

    P[0] = P[1] + M/M

    综上:P[0] = 0 + M/1 + M/2 + … + M/M,至此问题已经解决,不过我希望大家学到的不是这个答案,而是分析这个题目的过程

    最终答案:

    0 + M/1 + M/2 + M/3 + … + M/M

    括号里的式子在M比较大的时候约等于lnM,所以整个期望值大约是MlnM
    (因为lnx = ∫(x,1) 1/tdt,1 + 1/2 + ... + 1/M >= ∫(2,1) 1/tdt + ∫(3,2) 1/tdt + ... + ∫(M+1,M) 1/tdt = ∫(M+1,1) 1/tdt = ln(M+1), 1 + 1/2 + ... + 1/M <= 1 + ∫(2,1) 1/tdt + ∫(3,2) 1/tdt + ... + ∫(M,M-1) 1/tdt = ln(M) + 1,因此有
    ln(M+1) <= 1 + 1/2 + ... + 1/M <= ln(M)+1,又有ln(M+1) >= ln(M),所以…… )

           问题2: 你有一把宝剑。每使用一个宝石,有50%的概率会成功让宝剑升一级,50%的概率会失败。如果宝剑的级数大于等于5的话,那么失败会使得宝剑降1级。如果宝剑的级数小于5的话,失败没有效果。问题是:期望用多少个宝石可以让一把1级的宝剑升到9级?

    用a[i]表示从第i-1级升到第i级期望使用的宝石数量。

    当i<=5时,因为不会降级,则期望的数量均为2,即a[2] = a[3] = a[4] = a[5] = 2

    当i>5时,因为会降级,成功时一个宝石就够了,不成功时需要倒退一级,需要先使用a[i-1]个宝石先回到i-1级,再使用a[i]个宝石升到第i级,即

    a[i] = 1 * 1/2 + (1 + a[i-1] + a[i]) * 1/2

    即 a[i] = a[i-1] + 2

    可知,a[6]= 4, a[7] = 6, a[8] = 8, a[9] = 10

    则1级到9级需要的宝石数为 a[2]+…+a[9] = 36。

     问题3: 平均要取多少个(0,1)中的随机数才能让和超过1。答案: e 次, 其中e是自然对数的底

      

      问题3: 金刚坐飞机问题: 

    现在有一架飞机要起飞,乘客们正准备按机票号码(1,2,3...,N)一次排队登机。突然来了一只大猩猩(金刚)。他也有机票,但是他插队第一个登上了飞机,然后随意的选择了一个座位坐下了。根据社会的和谐程度,其他的乘客有两种反应:

    1.乘客们都义愤填膺,“既然金刚同志都不守规矩,为什么我要遵守?”他们也随意的找位置坐下,并且坚决不让座位给其他乘客。

    2.乘客们虽然感到愤怒,但是还是以“和谐”为重,如果自己的位置没有被占领,就赶紧坐下,如果自己的位置已经被别人(或者金刚同志)占了,就随机的选择另一个位置坐下,就开始闭目养神,不在挪动。

    问题:在这两种情况下,第i个乘客(出去金刚同志外)做到自己原机票位置的概率分别是多少?

    问题解答

    第一问:该问题相当于排序问题,总的排序总数是n个人的全排列为N!,如果第i个人做到第i个位置上,那么其余n-1个人的全排列为(N-1)!,综上所求概率为(N-1)!/N!=1/N。

    第二问:《编程之美》讲得比较复杂,没怎么看懂,在网上找了几个博文对该问题的解答,综合一下,这样理解比较容易:

    假设:F(i,n)表示在有n个座位的前提下,第i个人恰好做到第i个座位的概率;

    P(K=j)表示金刚刚好坐在位置j上的概率;

    P(i|K=j)表示在金刚做到位置j的前提下,第i个人恰好做到第i个位置上的概率。

    由以上的假设根据全概率公式有:

      由于金刚坐到每一个位置上的概率是相等的,容易知道P(K=j)=1/n;

      接下来我们只需要考虑后一项条件概率的值即可。

      (1)如果j=1,则表明金刚坐到第一个位置,则i坐到i位置的概率为1;如果j>i,前面的人必然按位置坐,所以概率也为1.所以我们只需要考虑1<j<i的情况,见下。

      (2)在1<j<i的情况下,即金刚坐在第j(1<j<i)个位置上,则j个乘客除非坐在金刚的位置上,否则同样要同样要抢占其他人的座位。这和金刚的行为是相似的(因为金刚除非坐在自己的位置上,否则抢占别人的座位),所以我们可以讲第j个乘客当做新的金刚,此时还剩余n-j个座位,同时把剩余乘客的编号也都减去j,则先前的第i个乘客座位号变为i-j,此问题和原问题相似,只是规模更小,所以该种情况下,条件概率为F(i-j,n-j).

      所以有如下等式:

       然后可以从上面的公式推出递推式:F(i,n)=F(i-1,n-1).(笔者验证了一下,公式是对的,但是不会推导,希望有会的网友指点)。

      有上面的递推公式,我们可以到:nF(i,n)=(n-i+1)+(i-2)F(i,n),则问题的最终答案为:

      

    问题4: 100人坐飞机,第一个乘客在座位中随便选一个坐下,第100人正确坐到自己坐位的概https://www.zhihu.com/question/35950050率是?

    他们分别拿到了从1号到100号的座位,这些乘客会按号码顺序登机并应当对号入座,如果他们发现对应号座位被别人坐了,就会在剩下空的座位随便挑一个坐.现在假设1号乘客疯了(其他人没疯),他会在100个座位中随便选一个座位坐下,问:第100人正确坐到自己坐位的概率是多少?(也可推广到n名乘客n个座位的情况)
         参考链接:https://www.zhihu.com/question/35950050
    6 截木棒问题总结: 一根木棒,截成三截,组成三角形的概率是多少?
    解法1:   1, 0.25

    假设整体长度为1(因为这个值不影响概率的计算,所以可以这样假设),第一段的长度是x,第二段为y,第三段为1-x-y。

    x,y值要想成为木棍切出来的长度必须要满足的条件为 0<x<1, 0<y<1,0<x+y<1,这些点构成了下图1中红色的部分。

    而这三段要构成三角形还必须满足:

    x+y>1-x-y => x+y>0.5

    x+1-x-y>y => y<0.5;

    y+1-x-y>y => x<0.5

    这些点构成图2中黄色区域。黄色区域与红色区域面积的比值就是,所有切割中能构成三角形的切割方式和所有切割方式的比值。也就是题目的答案。

    解法2: 

    假设我们选择的两个点的坐标是x和y(先假设x < y): 
    那么由三角形两边和大于第三边的性质,有: 
    x+y-x>1-y 
    x+1-y>y-x 
    1-y+y-x>x

    由上述不等式得到:x < 0.5, 0.5 < y < x+0.5 
    然后画个图就能得到联合概率为1/8,不要忘了这个结果是在假设x < y时得来的,所以再乘以2,得到1/4。
    参考链接:

    https://www.cnblogs.com/fanling999/p/6777335.html

    https://www.cnblogs.com/fanling999/p/6777335.html

    六 随机数题:(洗牌算法)

    关键在于保证各个随机数出现的概率相等。

    1. 已知有个rand7()的函数,返回1到7随机自然数,怎样利用这个rand7()构造rand10(),随机1~10。

    因为rand7()可以等可能的产生 1~7 之间的数字,因此 (rand7() - 1)等可能随机产生 0~6 的数,那么(rand7() - 1) * 7 + rand7() 可以等可能的产生 1~49 之间的数,因为上式中两个rand7()的组合数是唯一的。

    可以将1~49分成 1~40 和 41~49两个区间,选择 1~40这个区间平均划分成10段,每一个分段被随机到的概率相等,每个分段的长度为40/10 = 4,每个分段分别对应1~10。

    具体过程为:按公式 (rand7() - 1) * 7 + rand7() 随机一个数,若随机数落入41~49这个区间则丢弃,若随机数落入1~40这个区间,进一步确定分段对应的数值 (x-1)/4 + 1

    2. 已知有个randM()的函数,返回1到M随机自然数,怎样利用这个randM()构造randN(),随机1~N。

    前一题的推广。分两种情况:
    [1] 当 N <= M 时,可以直接使用 randM() 获取随机数,>N的随机数丢弃,<=N 的随机数输出即可。
    [2] 当 N > M 时候,需要构造 randM2 = (randM() ) * M + randM() 随机 1 ~ M2 的数值,

      rand_m(m) * m + rand_m(m) 的意思是先等概率生成 0, m, 2m, .. (m-1)*m,然后在加上 rand_m(m);最终效果相当于等概率生成 [0, m*m) 之间的数
    [3] 如果randM2仍然小于N,那么对 randM2 继续重复[2] 操作,如果randM2大于 N 则停止跳到 [1]

    3. 已知一随机发生器,产生0的概率是p,产生1的概率是1-p,现在要你构造一个发生器,使得它产生0和1的概率均为1/2

    由题目有:
    0 : p
    1 : 1-p

    连续产生两个数,其组合以及概率如下:
    00 : p2
    01 : p*(1-p)
    10 : (1-p)*p
    11 : (1-p)2

    可以发现 01 和 10 组合的概率是相等的,只需要将其分别映射到0和1即可。即每次随机产生两个数,如果组合为00或11则丢弃,若为01则映射到1,若为10则映射到0,这样一来产生0和1的概率均为 1/2 。

    4. 已知一随机发生器,产生的数字的分布不清楚,现在要你构造一个发生器,使得它产生0和1的概率均为1/2。

    使用该随机发生器产生随机数a,b,有以下3种情况:(1)a<b, (2) a == b, (3) a>b,其中情况(1)和(3)是对称的,发生的概率相等,只需要将这两种情况分别映射到0和1即可,其中遇到a==b时忽略。

    (也可以找另外一个概率相等的阈值)

    5. 已知一随机发生器,产生0的概率是p,产生1的概率是1-p,构造一个发生器,使得它构造1、2、3的概率均为1/3;…。更一般地,构造一个发生器,使得它构造1、2、3、…n的概率均为1/n。

    随机等可能的产生n个数,需要构造n个等可能的事件,每一个事件的发生映射到一个数值上即可。

    我们可以产生一个由0和1组成的序列,序列中0和1的个数相等,即各出现一半的情况下每种排列出现的概率都是相等的。

    随机产生长度为2x的序列,那么0和1各占x个,组合数有 C(2*x, x) >= n ,解出最小的x。对其中的n种等可能情况分别映射到1~n的数字上即可。

    6. 给出从n个数中随机选择m个数的方法。n很大,可以认为是亿级别。m可以很小,如接近1;也可以很大,如接近n。(n已知)

    两个有待改进的思路:
    (1) 以 1/n 的概率一直重复随机,直到获取了m个数为止
    缺陷:[1]难以知道后面随机的数是否与前面的随机数重复,因为数据量很大,不一定能在内存中进行比较。[2] 当m很大时,尤其是无限接近n时,后面产生的数字很多都已经在前面出现过。
    (2)每个数字被选中的概率是 m/n,可以遍历所有数字,在遍历的同时以 m/n的概率决定是否选择当前值。当遍历结束时,选择数字的个数在平均意义上来说是m,均值会随着数据量的增大会更好的趋向于m,但值得注意的是该过程仍不能精确的精确到m。

    改进后的思路:
    遍历第1个数时,选择的概率为 m/n
    遍历第2个数时,[1]如果选择了第一个数,则选择的概率为 (m-1)/(n-1);[2] 如果没有选择第1个数,则选择的概率为 m/(n-1)
    遍历第i个数时,[1]如果此时已经选择了k个数,那么选择第i个数的概率为 (m-k)/(n-i+1)
    这样一来可以保证在剩下的数字中选择适当的数使得总体的数字是m个。对于选择概率 (m-k)/(n-i+1) ,当k=m时概率为0,即所有数字已经选择完毕不再选择,当k=0时,分母会不断减小,以至于概率取向于1。最终得到的结果始终精确到m个数。证明见之前的文章

    7. 给出从n个数中随机选择1个的方法。注意,n非常大,并且一开始不知道其具体值。数字是一个一个给你的,当给完之后,你必须立刻给出随机的结果。

    由于n非常大并且需要立即给出答案,因此无法把所有数字都保存起来然后进行随机。
    再者n的具体值未知,因此任意时刻都需要有当前的结果。

    于是第1个数字肯定选。那么问题就变成了当第i个数字到来时,是保留当前数字还是选择第i个数字的问题,i=2,3,...,n。此过程必须保证截止目前为止所见到的数字被选中的概率都相等。

    假设当第i个数字到来时,前i-1个数字被选中的概率相等,此时只需要第i个数字被选中的概率为1/i即可保证当前的i个数字被选中的概率相等。因为截止目前见到的数字总共有i个,可以分成两个部分,即前i-1个数和第i个数,第i个数被选中的概率为1/i,那么不被选中的概率就为 (i-1)/i ,这时被选中的应该是前i-1个数中的一个,由假设可知前i-1个数被选中的概率相等,那么前i-1个数字任一一个被选中的概率为 ((i-1)/i)/(i-1) = 1/i。

    8. 给出从n个数中随机选择m个的方法。注意,n非常大,并且一开始不知道其具体值。数字是一个一个给你的,当给完之后,你必须立刻给出随机的结果。(n未知)

    本题是上一题的扩展。
    首先前m个数是必须取的,问题就变成了,当第i(i>m)个数到来时,是丢弃这个数还是保留这个数,如果保留这个数(第i个数),那么就需要从已选的m个数中选中一个丢弃。

    具体做法是,选取前m个数,依次读取第i(i>m)个数,并以 m/i 的概率决定是否选择这个数,如果选择了这个数,则随机的替换掉当前m个数中的任意一个。

    具体解释如下:
    假设前i-1个数字任一个被选中的概率相等,为 m/(i-1)。
    当第i个数字到来时被选中的概率为m/i(由定义可知),现在计算前i-1个数字中任一一个数字 k 被保留的概率,有两种情况:[1]第i个数字没被选中,那么k直接被保留,概率为(1-m/i); [2] 第i个数字被选中(m/i),并且删除当前m个数字中的一个,被删除的数字不是k(1-1/m),于是k仍然被保留的概率为 (m/(i-1)) * [ (1-m/i) + (m/i) * (1-1/m) ] = m/i

    由数学归纳法依次类推,当遍历完n个数,选中m数中,每个数被选择的概率都是相等的。

    七: 递推题:

    问题1: 五个海盗抢到了100颗宝石,每一颗都一样大小和价值连城。他们决定这么分:  
    抽签决定自己的号码(1、2、3、4、5)  
    首先,由1号提出分配方案,然后大家表决,当且仅当超过半数的人同意时,按照他的方案进行分配,否则将被扔进大海喂鲨鱼  
    如果1号死后,再由2号提出分配方案,然后剩下的4人进行表决,当且仅当超过半数的人同意时,按照他的方案进行分配,否则将被扔入大海喂鲨鱼,依此类推  
    条件:每个海盗都是很聪明的人,都能很理智地做出判断,从而做出选择。  
    问题:第一个海盗提出怎样的分配方案才能使自己的收益最大化?

    逆向思维,从45看,无论4分配多少给5,都可能被搞死,所以4不希望3死。

    从345看,4肯定会投赞成,所以不用管5,分配100,0,0就好了

    从2345看,3肯定希望2死,所以2别管3了,2就是争取45俩人,所以就98,0,1,1

    从12345看,2希望1死,所以1别管2了,1就是争取345仨人,所以就97,0,1,0,2或者97,0,1,2,0。

    问题2、小组赛,每个小组有5支队伍,互相之间打单循环赛,胜一场3分,平一场1分,输一场不得分,小组前三名出线。平分抽签。问一个队最少拿()分就有理论上的出线希望:

    还是逆向思维。假设A得一分,那么肯定是输三场平一场,则另外三个队伍胜利至少拿3分,A不会出线。

    假设A得两分,那么就是平两场,输两场,另外两个队伍胜利拿3分肯定出线,另外俩队伍,eg:B C,如果ABC之间打平手,BC和其他打输,那就ABC均为2分,DE为9分,那么A就有出线的希望。所以最少2分。

    几个关键概念

    以上分析过程涉及到的三个重要概念如下:

    1. 伯努利实验
    事件E只有两种可能结果:发生和不发生,概率分别为p和(1-p)。E独立重复进行n次可以称为n次伯努利试验。

    2. 二项分布
    n次伯努利试验发生k次的可能性服从二项分布:
    c(n,k) * p^k * (1-p)^(n-k)

    3. 几何分布
    几何分布有是指以下任一一种情况的离散型概率分布:
    [1] 1次成功需要执行伯努利试验的次数X,(X=1,2,3...)
    [2] 1次成功之前失败的次数 Y = X-1 =, (Y=0,1,2....).

    注意区分以上两种情况,以上两种情况的概率分布为:
    [1] P(X=k) = (1-p)(k-1) * p , k = 1,2,... (第k次是第一次成功)
    [2] P(X=k) = (1-p)k * p , k = 0,1,2,... (失败了k次以后第一次成功)

    以上两种情况下的几何分布的均值和方差:
    [1] E(X) = 1/p , D(X) = (1-p)/p2
    [2] E(X) = (1-p)/p, D(X) = (1-p)/p2

    举例:
    一个六面的骰子,平均需要投掷多少次可以掷出数字6:
    p = 1/6, 1-p = 5/6
    E(X) = 1/p = 6 次

    参考链接:https://www.cnblogs.com/fanling999/p/6777335.html

  • 相关阅读:
    CDH健康检查报DATA_NODE_BLOCK_COUNT告警
    log4net 日志不能输出
    beetsql 入门学习
    http headers详解
    python3 urllib学习
    python学习疑难1 -- 解决python3 UnicodeEncodeError: 'gbk' codec can't encode character 'xXX' in position XX
    Filter的应用
    SQL简单存储过程
    脑残问题收集
    core 标签简单使用
  • 原文地址:https://www.cnblogs.com/xianbin7/p/10720611.html
Copyright © 2011-2022 走看看