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

//假设输入的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