Algorithm &引用;“编程珍珠”:从序列中采样m个元素

Algorithm &引用;“编程珍珠”:从序列中采样m个元素,algorithm,sampling,Algorithm,Sampling,从编程珍珠:: 输入由两个整数m和n组成,其中m

从编程珍珠::

输入由两个整数m和n组成,其中m 作者提供了一种解决方案:

initialize set S to empty
size = 0
while size < m do
    t = bigrand() % n
    if t is not in S
        insert t into S
        size++
print the elements of S in sorted order
将集合S初始化为空
大小=0
当尺寸
在上面的伪代码中,
bigrand()
是一个函数,返回一个大的随机整数(比m和n大得多)

有人能帮我证明上述算法的正确性吗

根据我的理解,每个输出都应该有1/C(n,m)的概率。
如何证明上述算法能够保证概率为1/C(n,m)的输出?

该算法得到的每个解都是有效的

有多少种解决方案? 直到最后一行(排序)有
n*(n-1)*(n-2)*..*(n-m)
不同的排列或
n/(n-m)并且每个结果具有相同的概率

排序时,可能的解决方案数量减少了m

所以可能输出的数量是
n/((n-m)!*m!)
这就是你想要的

n/((n-m)!m!)=C(n,m)