面试过程中有趣的概率问题(坐飞机、扑克牌)

扑克牌

54张扑克,平均分给三人,大小王在一个人手里的概率

这个可以直接组合数计算,我们把这两张牌拿出来,就是16,18,18

16的那个人就相当于去52张牌里拿十二张,因为两个人都是18,所以要去重

可以求得分子为C(52,16)*C(36,18)*C(18,18)*3

同理求的分母为C(54,18)*C(36,18)*C(18,18)

然后根据组合数公式,也就是18*17*3/(54*53)=17/53

#include<bits/stdc++.h>
using namespace std;
const int MD=1e9+7,N=2e6+5;
int f[N],v[N];
void Init()
{
    v[0]=v[1]=f[0]=f[1]=1;
    for(int i=2; i<N; i++) f[i]=1LL*f[i-1]*i%MD,v[i]=1LL*v[MD%i]*(MD-MD/i)%MD;
    for(int i=2; i<N; i++) v[i]=1LL*v[i-1]*v[i]%MD;
}
int C(int n,int m)
{
    if(m<0||m>n) return 0;
    return 1LL*f[n]*v[m]%MD*v[n-m]%MD;
}
int main()
{
    Init();
    int n,m;
    while (cin>>n>>m)cout<<C(n,m)<<"\n";
    return 0;
}
线性求逆元求组合数模版

当然有些人就不想那样写组合数,分子写成C(52,18)*C(34,18)*C(16,16)*3也是可以的,只是通分没那么好看,数值都是一样的

还是以某人抽到大王为基准,而且还得抽到小王。大王可以出现在3×18的任意位置,小王也必须出现在相同的人手中,但不能出现在大王出现的那一轮(共17轮)。
即3×18×17 
总共有3×18×53种情况,即小王不与大王相同位置。这是兔小弟的做法,我觉得也很巧妙哦

扩展问题变成了,一个人拿20张,另两个人拿17张。hhhh斗地主的真实情况

地主当然概率要高些,但是具体是多少呢,我们可以看一下

分母比较简单,先写出分母C(54,20)*C(34,17)*C(17,17)*3

这三个人可能的牌是18 17 17和20 17 15

写出分子就是C(52,18)*C(34,17)*C(17,17)*3+C(52,20)*(32,15)*C(17,17)*6

约分可以算出来是0.434661,上面那个值是0.320755

第一个有同学觉得一眼看过去就是1/3,但是实际上去错误的

比如两副牌,有些人就觉得是1/2,其实是一个比1/2略小的数,16/53。

为什么会有这种情况呢,因为进行了占位,你这张牌有了就占去了那个位置,就不能直接乘上概率了

我们可以考虑6张牌分给两个人,这样算出来是2/5,其实公式就是(n/m-1)/(n-1)(n代表牌数,m代表分的堆数)

四个人,除去两张大小王剩下52张扑克牌。问红桃A和黑桃A同时被一个人拿到的概率,这个你很快算出来12/51了,隔壁还在自闭呢

但是你只要不平分或者不能平分就会出现烦人的约分问题,平分之前这个数肯定小于1/m,不平分之后肯定大于1/m,这算是神奇的不等式吧

100人坐飞机,第一个乘客在座位中随便选一个坐下,第100人正确坐到自己坐位的概率是?

他们分别拿到了从1号到100号的座位,这些乘客会按号码顺序登机并应当对号入座,如果他们发现对应号座位被别人坐了,就会在剩下空的座位随便挑一个坐.现在假设1号乘客疯了(其他人没疯),他会在100个座位中随便选一个座位坐下,问:第100人正确坐到自己坐位的概率是多少?(也可推广到n名乘客n个座位的情况)
 
其实是一个递归问题
1名乘客1个位置 100%
2名乘客2个位置 你的状态和第一个人有关,50%
3名乘客3个位置 第一个坐对了,那就是回到了状态2
         第一个人占到你的位置
         第一个人坐到另一个人的位置,还是状态2  这个概率是多少呢,就是(1/6+1/6)*3,还是50%
4一直往复下去还是如此
看起来你只和第一个人有关,第一个人第 [公式] 个人登机时,他的座位被占的概率是 [公式] 
 
 
不均匀的硬币怎么让两个人等概率呢,可以扔两次,相同了就再来,先反或先正为胜利。能粘的话粘起来也是可以的
 
 
 
posted @ 2019-08-05 16:21  暴力都不会的蒟蒻  阅读(1234)  评论(0编辑  收藏  举报