基础概率面试题汇总

参考资料1
参考资料2

  1. 在半径为1的圆中随机选取一点。
    方法1:在x轴[-1,1],y轴[-1,1]的正方形随机选取一点,如果此点在圆内,则即为所求的点。如果不在圆内,则重新随机直到选到了为止。
    方法2:从[0, 2*pi)随机选取一个角度,再在这个方向的半径上随机选取一个点。但半径上的点不能均匀选取,选取的概率要和离圆心的距离成正比,这样才能保证随机点在圆内是均匀分布的。

  2. 一根木棒,截成三截,组成三角形的概率是多少?
    设第一段截x,第二段截y,第三段1-x-y。
    考虑所有可能的截法。可能的截法中必须保证三条边都是正数且小于原来边长,则有0<x<1,0<y<1,0<1-x-y<1,画图可知,(x,y)必须在单位正方形的左下角的半个直角三角形里,面积为1/2。
    然后考虑能形成三角形的截法。首先要满足刚才的三个条件0<x<1,0<y<1,0<1-x-y<1,然后必须符合三角形的边的要求,即两边之和大于第三边,x+y>1-x-y,x+1-x-y>y,y+1-x-y>x,化简即得
    0<x<1/2,0<y<1/2,1/2<x+y<1
    画图可知,此时(x,y)必须在边长为1/2的三角形的右上角的半个直角三角形里,面积为1/8。
    于是最终概率为 (1/8)/(1/2) = 1/4。

  3. 抛一个六面的色子,连续抛直到抛到6为止,问期望的抛的次数是多少。
    因为每次抛到6的概率相等,都是1/6,于是期望的次数就是1/(1/6)=6次。
    下面用一种不一样的方法解答,假设期望的次数为E。考虑第一次抛,如果已经抛到6了(概率为1/6),那么就不用再抛了。如果没抛到6(概率为5/6),那么还需要继续抛,可是还要抛多少次呢?显然,现在开始知道抛到6的次数仍然是E,但是刚刚已经抛了一次了于是可以得到这个等式
    E = 1 * 1/6 + (1 + E) * 5/6,
    解得 E = 6。即期望的次数为6次

  4. 一个木桶里面有M个白球,每分钟从桶中随机取出一个球涂成红色(无论白或红都涂红)再放回,问将桶中球全部涂红的期望时间是多少?
    令桶中有i个红球后再把全部球涂红的期望时间为a[i],此时再取出一个球,如果是红色的(概率为i/M),则直接放回,且剩余的期望时间仍是a[i]。如果是白色的(概率为1-i/M),则涂红后放回,剩余的期望时间为a[i+1],则
    a[i] = (1 + a[i]) * i/M + (1 + a[i+1]) * (1 – i/M)
    即   a[i] = a[i+1] + M/(M-i)
    显然,有a[M] = 0
    可以解得 a[0] = M/M + M/(M-1) + … + M/1 + 0

  5. 你有一把宝剑。每使用一个宝石,有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

  6. 已知有个rand7()的函数,返回1到7随机自然数,怎样利用这个rand7()构造rand10(),随机1~10。
    产生随机数的主要原则是每个数出现的概率是相等的,如果可以得到一组等概率出现的数字,那么就可以从中找到映射为1~10的方法。
    rand7()返回1~7的自然数,构造新的函数 (rand7()-1)*7 + rand7(),这个函数会随机产生149的自然数。原因是149中的每个数只有唯一的第一个rand7()的值和第二个rand7()的值表示,于是它们出现的概率是相等。
    但是这里的数字太多,可以丢弃4149的数字,把140的数字分成10组,每组映射成1~10中的一个,于是可以得到随机的结果。
    具体方法是,利用(rand7()-1)*7 + rand7()产生随机数x,如果大于40则继续随机直到小于等于40为止,如果小于等于40,则产生的随机数为(x-1)/4+1。

  7. 已知有个randM()的函数,返回1到M随机自然数,怎样利用这个randM()构造randN(),随机1~N。
    上题的扩展。
    当N<=M时可以直接得到。
    当N>M时,类似构造(randM()-1)*M + randM(),可以产生1M^2(即randM^2),可以在M^2中选出N个构造1N的映射。
    如果M2还是没有N大,则可以对于randM2继续构造,直到成功为止。

  8. 已知一随机发生器,产生0的概率是p,产生1的概率是1-p,现在要你构造一个发生器,使得它产生0和1的概率均为1/2。
    考虑连续产生两个随机数,结果只有四种可能:00、01、10、11,其中产生01和产生10的概率是相等的,均为p*(1-p),于是可以利用这个概率相等的特性等概率地产生01随机数。
    比如把01映射为0,10映射为1。于是整个方案就是:
    产生两个随机数,如果结果是00或11就丢弃重来,如果结果是01则产生0,结果是10则产生1。

  9. 已知一随机发生器,产生的数字的分布不清楚,现在要你构造一个发生器,使得它产生0和1的概率均为1/2。
    思路类似,考虑连续产生两个随机数a、b,结果有三种情况a==b,a>b,a<b,其中由于a和b的对称性,a>b和a<b出现的概率是相等的,于是可以利用这个概率相等的特性等概率地产生01随机数。方法类似。
    或者可以找到另一种概率相等的事件,比如选择一个阈值th,把随机数的结果分为小于阈值和大于等于阈值两种情况,于是连续产生两个随机数,他们一个小于阈值,另一个大于等于阈值的概率是相等。然后类似产生随机数。

  10. 已知一随机发生器,产生0的概率是p,产生1的概率是1-p,构造一个发生器,使得它构造1、2、3的概率均为1/3;…。更一般地,构造一个发生器,使得它构造1、2、3、…n的概率均为1/n。
    此时我们已经知道,要从n个数中等概率地产生一个随机数,关键是要找到n个或更多个出现概率相等的事件,然后我们重复随机地产生事件,如果是跟这n个事件不同的事件直接忽略,直到产生这n个事件中的一个,然后就产生跟这个事件匹配的随机数。由于n个事件发生的概率相等,于是产生的随机数的概率也是相等的。
    考虑连续产生x个随机数,结果应该是x个0跟1的组合,为了使某些结果出现的概率相等,我们应该要让这个结果中0和1出现的次数相等,即各占一半。于是x的长度必须是偶数的,为了方便,考虑连续产生2x个随机数。每个0跟1各出现一半的结果可以赋予1到n的某个数,为了能够表示这n个数,需要0跟1各出现一半的总结果数大于等于n,即
    C(2x, x) >= n
    解出最小的x即为效率最高的x。
    然后把前n个0和1个出现一半的结果分别赋予1到n的值。随机时连续产生2
    x个数,如果不是这n个结果中的一个则重新随机,如果是的话则产生对应的值作为随机结果

  11. 给出从n个数中随机选择m个数的方法。n很大,可以认为是亿级别。m可以很小,如接近1;也可以很大,如接近n。
    一个直接的思路是一直重复地随机,直到随机到m个数为止。这个方法有两个弊端:
    (1). 难以知道后面随机到的一个数是否在前面已经随机过了,因为数据量很大,无法保存在内存中,如果保存到外存中则时间花费太大。
    (2). 如果m很大,甚至接近于n,则后面随机到的数字基本上都是前面随机过的,因而需要尝试的随机次数太多。
    一个思路是每个数被选中的概率是m/n,则可以遍历一遍原数据,在遍历每个数字的同时以m/n的概率决定是否要选择当前数字,则当遍历完毕的时候,选择到的数字在平均意义就是m个。这个会随着n的增大而更好地趋近于m,但不能很精确地保证随机到的数字一定是m个。
    以上思路虽然不能满足要求,但我们可以进行改进。刚才我们在遍历每个数字的时候都是以同样的概率m/n决定是否要选择该数字,实际上,在当前遍历数字的前面的数字的结果我们是已经知道了,我们可以根据前面的随机结果动态地调整当前的随机策略,使得最终能够保证随机到的数字一定是m个。
    具体的做法是,遍历第1个数字时有m/n的概率进行选择,如果选择了第1个数字,则第2个数字被选择的概率调整为(m-1)/(n-1),如果没选择第1个数字,则第2个数字被选择的概率为m/(n-1)。即遍历到第i个数字的时候,如果此时已经选择了k个,则以(m-k)/(n-i+1)的概率决定是否要选择当前的第i个数字。
    这样可以保证每次都能够保证在剩下的数字中能选择适当的数使得总体选择的数字是m个。比如,如果前面已经随机了m个,则后面随机的概率就变为0。如果前面一直都没随机到数字,则后面随机到的概率就会接近1。最终得到的结果始终精确地是m个数字。

  12. 给出从n个数中随机选择1个的方法。注意,n非常大,并且一开始不知道其具体值。数字是一个一个给你的,当给完之后,你必须立刻给出随机的结果。
    这里n的值非常大,而且要求立即给出答案,所以不能把所有的数字先保存起来,然后再慢慢考虑要随机哪个。
    这题跟上面一题比较类似,因为我们不知道数字到底有多少个,所以必须在得到每一个数字的时候就有一个当前的结果,这样在数字给完的时候可以给出答案。
    于是第1个数字是必须要拿的。问题是当第2个数字来的时候,究竟要保留手上的数字,还是拿当前的第2个数字呢?更一般地,当第i(i>1)个数字来的时候,究竟是保留手上的数字,还是选择当前的第i个数字呢?
    答案是要保证每个数字被选取的概率是相等,当第i个数来的时候,如果我们已经保证了前i-1个数每个数被选取的概率都是相等的,那么只要第i个数字被选取的概率是1/i,我们就可以知道所有i个数被选取的概率都是1/i了。所以只需要以1/i的概率决定是否要选取当前的第i个数字即可。
    于是可以保证对于任意的n,当给完n个数字时,选择每个数字的概率都是相等的,为1/n。

  13. 给出从n个数中随机选择m个的方法。注意,n非常大,并且一开始不知道其具体值。数字是一个一个给你的,当给完之后,你必须立刻给出随机的结果
    这题是上一题的推广,于是可以仿照着进行。
    首先前m个数字是必须拿的。问题是当第i(i>m)个数字来的时候,究竟是要丢弃这个数,还是保留这个数?如果要保留这个数的话,则必须得丢弃手中已有的m个数,那是怎么确定丢弃哪个呢?
    下面是就具体的做法。第i个数到来的时候,以m/i的概率决定是否要选择这个数字。如果选择了这个数字,则随机地替换掉手上m个数字中的一个。
    如果前i-1个数字的时候保证了每个数字被选取的概率相等,则这样做之后可以保证每个数字被选取的概率也相等,为m/i。
    (1).第i个数选择的概率是m/i,因为算法就是这样决定的。
    (2).考虑前i-1个数字中的任意一个,它在第i个数之前被选择的概率是m/(i-1)。在第i个数字的时候,这个数字要被选择的话又两种可能,一是第i个数没有被选中(概率是1-m/i),二是第i个数倍选中了(概率是m/i)但是替换掉的数字不是它(概率是1-1/m),于是这个数在第i个数时仍然被选择的概率是m/(i-1) * ((1-m/i) + (m/i * (1-1/m))) = m / (i-1) * ((i-1) / i) = m/i。
    由数学归纳法原理知,对于任意的n,当给完n个数的时候,选择的结果可以保证这n个数中每个被选中的概率都是相等

概率题和组合题,面试,笔试
14. 一个桶里面有白球、黑球各100个,现在按下述规则取球:

  • i 、每次从桶里面拿出来两个球;
  • ii、如果取出的是两个同色的球,就再放入一个黑球;
  • iii、如果取出的是两个异色的球,就再放入一个白球。
    问:最后桶里面只剩下一个黑球的概率是多少?
    动态规划,令f[i,j]表示有i个白球,j个黑球的概率。
    已知f[100,100] = 1, 求f[0,1]。
    拿到两个白球: f[i-2,j+1] = i/(i+j) * (i-1)/(i+j-1) * f[i,j]
    拿到两个黑球: f[i, j-1] = j/(i+j) * (j-1)/(i+j-1) * f[i,j]
    拿到一黑一白: f[i, j-1] =2 * i/(i+j) * j/(i+j-1) * f[i,j]
  1. 10个人出去玩,集合时间有10分钟,每个人都在该时间内到达,概率均匀分布,彼此独立,那么最后一个人最有可能到达的时间是?
    遇到这种想不明白,最好的方法就是枚举。
    若最后一个人在10分钟到达(概率1/10),其他人也都已经到达了(概率是1),总概率是 1^9 * (1/10)
    若最后一个人在9分钟到达(概率1/10),其他人到达的概率是(9/10)^9,总概率是 (9/10)^9 * (1/10)
    依此类推。可见概率最大的是第10分钟。

  2. 已知随机数生成函数f(),返回0的概率是60%,返回1的概率是40%。根据f()求随机数函数g(),使返回0和1的概率是50%,不能用已有的随机生成库函数。
    答:
    调用f()两次即可,会出现4种结果(0,0), (0,1), (1,0), (1,1),其中出现(0,1), (1,0)的概率是一样的,可以构造出等概率事件,比如出现(0,1)可返回0,出现(1,0)可返回1,如果出现其他两种情况则舍掉重新调用。

  3. 给定rand5(),实现一个方法rand7()。也即,给定一个产生0到4(含)随机数方法,编写一个产生0到6(含)随机数的方法。
    答:
    随机数函数的关键是确保产生每一个数的的概率相等。我们可用通过5 * rand5() + rand5()产生[0:24],舍弃[21:24],最后除以7取余数,则可得到概率相等的[0:6]的数值。

  4. 一百个人,每人戴一顶帽子,帽子有黑白两色每人可看前面所有人的帽子颜色,但不能看自己的和后面的
    然后说自己帽子的颜色 对了就可以活,没对立刻杀死
    从最后一个人开始说
    问:最多有多少人能活下来
    答:
    必能活下来的有99人!!!要牺牲的就是最后一人,活下来的可能性为1/2。
    第一百个人先数出前面九十九人共戴了奇数还是偶数顶黑帽子,奇数就喊“黑色”,偶数就喊“白色”。第九十九人再数出前面的人戴了奇数还是偶数顶黑帽子,如和后面第一百个人抱的答案一样,就说明自己戴了白帽子(否则黑帽子奇偶就改变了),就喊“白色”,同时也告诉了前面的人黑帽子是偶数顶。反之则喊“黑色”,同时也告诉了前面的人黑帽子是奇数顶。前面每个人都用这个方法判断自己的帽子的颜色,并传达帽子的奇偶,就能使前99人都活下来。

  5. 54张牌,平均分成三堆,大小王在同一堆的概率?
    (C1652∗C1836∗C1818/A22) / (C1854∗C1836∗C1818/A33)=17/53

或者可以这么想。先平均分三堆,大王在第一堆的概率是1/3, 小王在剩下的53张牌中,有17/53的概率和大王同一堆。依此类推,大王还可能在2,3堆,因此
1/3∗17/53∗3=17/53

  1. 买饮料,三个瓶盖可以换一瓶,请问要买100瓶饮料,最少需要买多少瓶?
    假设要买i瓶饮料,最少需要买a[i]瓶。
    a[1] = 1, a[2] = a[1]+1, a[3] = a[2]+1, a[4] = a[3]
    a[i] = a[i-1] if i%3=1
    a[i-1]+1 otherwise
    a[100] = a[99]+1-1 = (a[98]+1)+1-1 = (a[97]+1)+1 = (a[96])+1+1 = a[1] + 199-133= 67
    (给的答案有问题)
    设要买x瓶。
    x+x/3>=100
    对么?小心!x/3瓶如果满3瓶还可以再换的,想象某人堵在小卖部门口狂开瓶。因此应该是
    x+x/3+x/9+…+x/3n>=100
    n=log3x
    x(1−1/3n)/(1−1/3)>=100
    x(1−1/x)>=200/3
    x=68

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

To do
其他概率题目的
https://blog.csdn.net/bertdai/article/details/78070092

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值