您的位置:首页 > 其它

概率问题总结

2015-08-06 13:35 337 查看
1. 给N张扑克牌和一个随机函数,设计一个洗牌算法 [CC150]

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

伪码如下

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


C++实现

Init : a reservoir with the size: k
for i= k+1 to N
M=random(1, i);
if( M < k)
Swap the Mth value and ith value
end for


View Code

ref1 ref2

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

方法:级联法

两个0,1 随机生成器级联,每次产生两个数,则可能的结果有(0,0), (0,1), (1,0), (1,1),分别映 射到0, 1, 2, 3即可

follow up:

3.1 如何用rand7生成rand9?

两个rand7可以产生49种可能,扔掉后面的4种,保留前45个,并平均分成9份。

每次产生一个结果时,假如没落在对应区间中就扔掉,否则根据落在哪个区间判断是0~8中哪个。

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

将两枚硬币级联,只保留“正反”,“反正”两种结果,其他两种结果扔掉

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

方法:方程法

对这种n不确定或有可能无限循环的题,可以考虑化大为小、列方程。

P(A) = (1/2)^1 + (1/2)^4 + (1/2)^7 + ...

P(B) = (1/2)^2 + (1/2)^5 + (1/2)^8 + ...

P(C) = (1/2)^3 + (1/2)^6 + (1/2)^9 + ...

所以,

P(B) = 1/2*P(A) ,P(C) = 1/4 * P(A); P(A) + P(B) + P(C) = 1;

可得 P(A) = 4/7, P(B) = 2/7, P(C) = 1/7

5. A有n个硬币,B有n+1个硬币,谁丢的正面多谁赢,问A不输的概率?

对前n轮而言,有3种情况:A>B, A<B, A=B.

设P(A>B) = x, P(A == B) = y,由对称性P(A<B) = x,则有2x + y = 1
现在来看B扔最后一个硬币的情况:
• 假如之前A>B,则无论怎么扔,A都不会输,最多平. 概率为x
• 如果A==B,则B扔了正面,A才会输,这是0.5y;则A不输的概率也为0.5y
• 如果A<B,则无论B怎么扔,A都输
所以A不输的概率是:x + 0.5y = 0.5 * (2x + y) = 0.5

6. 一个机器人在原点,右边有一个距离为k的点,机器人以p的概率右移一步,1-p概率左移一步, 问经过M步机器人处于k点的概率?

k步右移,剩下的M - k步一半左移一半右移,所以

若 M<k 或 (M - k)%2 == 1 ,则概率为0

其他情况下:M中选k + (M-k)/2步的概率

7. 扔硬币直到连续两次出现正面,求扔的期望次数

假设期望次数是E,我们开始扔,有如下几种情况:
• 扔到的是反面,那么就要重新扔,所以是0.5*(1 + E) 【从头来过,递归的继续扔,从这时起期望仍是E】
• 扔到的是正面,再扔一次又反面了,则是0.25*(2 + E)
• 扔连续两次都是正面,结束,则是0.25*2
所以递归来看E = 0.5*(1 + E) + 0.25*(2 + E) + 0.25*2,解得E = 6
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: