洗牌算法 及其证明

今天看到了网易往年的一题面试题,是要写洗牌算法及其证明的。要保证每张牌的概率都是1/N。

假设有N张牌。用数组poker[]表示。

srand(time(NULL));
for(int i = 0; i < N; ++i) {
    int temp = rand() % (i+1);
    if(temp != i)//这里有i/(i+1)的概率交换,而每张牌被交换的概率为1/i
        swap(poker[i],poker[temp]);
}

下面为证明过程:
就像上面所说的那样。
没个循环,都保证了牌的概率为1/(i+1);
证明如下:
首先,temp是0~i,概率为1/(i+1),所以temp != i的概率为i/(i+1)
其次,temp之前一共有i个数,每个数的概率都是相等的(这里其实可以用数学归纳法),那么每个数被交换的概率是,1/i * i/(i+1) = 1/(i+1)
得证。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值