概率面试题

转载自https://blog.csdn.net/bertdai/article/details/78070092

1. 从单位圆中均匀采样

M1: 拒绝采样方法

我们拥有从[1,1]中均匀采样的方法,那么我们可以通过拒绝采样的方法来实现从单位圆中均匀采样。

即我们要证明z=(x,y)U(1,1),U(1,1),p(z|accept)=c,通过贝叶斯定理很容易证明

因此我们拥有拒绝采样的思路

for _ in range(1000):
    x = random.uniform(-1, 1)
    y = random.uniform(-1, 1)
    if x**2 + y**2 <= 1:
        points.append((x, y))

M2: 极坐标变换

首先对半径进行采样,如果是均匀分布的话

FX(x)=P(Xx)=x2FX1(x)=x

因此我们只需要对半径进行采样,然后对角度进行采样即可

for _ in range(1000):
    r = math.sqrt(random.uniform(0, 1)) * radius
    theta = random.uniform(0, 2 * math.pi)
    x = r * math.cos(theta)
    y = r * math.sin(theta)
    points.append((x, y))

2. 一根木棒,截成三截,组成三角形的概率是多少

首先我们仅要对两截进行建模即可,假设第一截长度为x,第二截长度为y,那么第三截长度为1xy,那么我们只需要满足三角形的三边不等式即可

f(x,y)=c,0x1,0y1,01xy1f(x,y)=1

同时满足三角形的三边不等式

x+y1xyy+1xyx1xy+xy

不难得出最终的概率为14

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

这是一个几何随机变量,其中p=1/6

p(x=k)=(1p)k1p

我们求解几何随机变量要使用全期望公式,下面简单推导一下

Ex|A[x]=xxp(x|A)

那么 x 的全期望为

E[x|Ai]=AiEx|Ai[x]p(Ai)=Aixxp(x|Ai)p(Ai)=xxAip(x|Ai)p(Ai)=xxp(x)

对于另一个随机变量y,我们也有全期望公式

E[x]=yp(y)Ex|y[x]=yp(y)xxp(x|y)=xxyp(x|y)p(y)=xxp(x)

因此对于几何随机变量,我们有

E[x]=xxp(x)=xx(1p)x1p

如果我们求第一次抛出后的期望次数,那么我们可以通过全期望公式求解

E[x|1]=1E[x|0]=1+E[x]

因此我们有

E[x]=pE[x|1]+(1p)E[x|0]=p+(1p)(1+E[x])E[x]=1p=6

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

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

记号说明:E[n]代表从 n 级升到 9 级的期望宝石数,我们使用全期望公式来求解

E[n]=0.5E[n+1|1]+0.5E[n|0]

E[n]={1+12E[n+1]+12E[n1]n51+12E[n+1]+12E[n]n<5

通过递推我们可以求解出来E[1]=16

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

首先我们可以通过 rand7() 来构造 rand49(),即rand49() = (rand7() - 1) * 7 + rand7(),然后通过拒绝采样+取模的方法来构造 rand10()

def rand10():
    while True:
        num = (rand7() - 1) * 7 + rand7()
        if num <= 40:
            return num % 10 + 1

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

pass

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

考虑构造一个发生器,产生 01 和 10 的概率均为 1/2,那么我们可以通过两次调用原发生器来实现

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

利用对称性,我们可以通过两次调用原发生器来实现

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

首先要求实时性,那么对于第一个数,我们首先选取

当出现第k个数时,如果我们选择第k个数的概率为1k,这样我们就可以保证每个数被选取的概率为1n

proof

第 k 个数字被选取的概率为1k,那么前 k-1 个数字被选取的概率为k1k,而上一轮每一个数字被选取的概率为1k1,因此每一个数字被选取的概率为1k

proof end

posted @   Blackteaxx  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示