码迷,mamicode.com
首页 > 其他好文 > 详细

概率问题总结

时间:2015-08-06 14:54:18      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:

1. 给N张扑克牌和一个随机函数,设计一个洗牌算法

关键点:如何保证每张牌等概率地出现在每个位置

 伪码如下

for i in 1…n:
    randomly select a card j from [1,i]
    swap card i with card j

C++实现

技术分享
 1 void shuffle(vector<int> cards, int n) {
 2     if (cards.empty()) {
 3         return;
 4     }
 5     srand(time(0));
 6     for (int i = 1; i <= n; i++) {
 7         int j = 1 + rand() % i;        
 8         swap(cards[i - 1], cards[j - 1]);
 9     }
10 }
shuffle

用数学归纳法证明其正确性:

1. 当N=1时,P(N张牌到任意位置的概率)= 1/N ; 成立

2. 假设当N = k时成立,那么当N=k+1时,我们只需要判断是否满足每张牌到每个位置的概率都是1/N即可。

这里我们对于判断“每张牌到每个位置”分成两大部分,三小部分,看它们的概率是否是1/N。即:

<1> 第k+1张牌到任意位置

由算法可知,当i=k+1时,从1~i中随机选出一个位置j,将其与i位置的元素互换。
由此可知,第k+1张牌到任意位置的概率都是相等的,即都是1/(k+1);
同理可知,<2.1>也得证。即前k张牌到第k+1位置的概率也都是相等的。

<2> 前k张牌到任意位置

  <2.1> 前k张牌到第k+1位置

  <2.2> 前k张牌到前k个位置(即前k张牌中任一张牌到前k个位置中的任一位置)

这里需要用到贝叶斯公式,即条件概率。
这里我们要求的实际上是前k张牌中任一张牌X到前k个位置中的任一位置index的概率,如果等于1/(k+1)即得证。
令事件A为这张牌X不被换到第k+1位置处,事件B为牌X被换到前k个位置中的某位置index
已知 P(B|A) = 1/k , P(A) = 1 - (1 / (k+1))
则 P(B) = P(B|A)*P(A) + P(B|~A)P(~A)
     = 1/k * [1-(1/(k+1))] + 0
= 1/(k+1)

 

2. 如何等概率地从n个数中随机抽出m个数?

 

follow up: 如果上题中n大小不确定,如何做?

 

3. 给定一个能够生成0,1两个数的等概率随机数生成器”,如何生成?个产生0,1,2,3的等概率随机数生成器?

 

follow up:

 

3.1 如何用rand7生成rand9?

 

3.2 有1枚硬币,以p的概率产生正面,以1-p的概率产生背面,如何利用它产生一个0.5概率的生成器?

 

4. A,B,C三人轮流扔硬币,第一个扔到正面的人算赢,问三个人赢的概率分别为多大?

 

概率问题总结

标签:

原文地址:http://www.cnblogs.com/forcheryl/p/4707766.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!