从0到n-1中随机等概率输出m个不同的数

本文深入探讨了Knuth洗牌算法,详细解释了如何通过该算法从n个元素中等概率选择m个不同元素的过程。算法通过循环迭代,利用随机数生成器实现元素的选择,确保了每个元素被选中的概率均为m/n。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//假设输入的n远大于m
void knuth(int n, int m)
{
    for (int i = 0; i < n; i++) 
    {
        if (rand() % (n - i)<m) 
        {
            cout << i << endl;
            m--;
        }
    }
}

证明:

1.输出不同的m个值:

由这个for循环循环n次,且在满足条件时才输出i,可知,输出不同值的要求已满足,因为每次输出的都是i值,而i值每次都是不一样的,m--保证了程序在输出了m个值后就不再输出i。


2.等概率:

在i=0时,rand()%(n-i)的取值范围为0到n-1,共n个数,此时要输出0只需要rand()%(n-i)小于m,故i=0被输出的概率为m/n;

在i=1时,rand()%(n-i)的取值范围为0到n-2,共n-1个数,若i=0没有被输出,则m--未被执行,此时i=1被输出的概率为m/(n-1),若i=0已经被输出了,则m变为m-1,此时i=1被输出的概率为(m-1)/(n-1);由概率论的知识,可知此时i=1被输出的概率为

P=(1-m/n)*(m/(n-1))+m/n*((m-1)/(n-1))=m/n;

以此类推,可知每个数被输出的概率都为m/n。



 作者:乔磊
 链接: https://www.zhihu.com/question/58864210/answer/160705670
 来源:知乎

转载于:https://www.cnblogs.com/ThatsMyTiger/p/6892399.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值