从编程珍珠:Column 12: A Sample Problem:
输入由两个整数m和n组成,m范围为0..n-1的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
在上面的伪代码中,
bigrand()
是一个函数,返回一个大的随机整数(远远大于m和n)。有谁能帮我证明以上算法的正确性吗?
根据我的理解,每个输出的概率应该是1/c(n,m)。
如何证明上述算法能保证输出概率为1/c(n,m)?
最佳答案
该算法得到的每个解都是有效的。
有多少种解决方案?
到最后一行(排序)是不同的排列或n*(n-1)*(n-2)*..*(n-m)
并且每个结果都有相同的概率
当你排序时,你将可能的解决方案的数量减少了m!是的。
所以可能的输出数是n!/(n-m)!
,这是您所要求的。n!/((n-m)!*m!)
关于algorithm - “编程珍珠”:从序列中采样m个元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11706920/