完整问题是:
编写一个方法,从大小为
n
的数组中随机生成一组m个整数。每个元素必须具有相同的被选择概率
这个问题来自“破解编码面试”,解决方法是:
我们可以将元素与数组开头的元素交换,然后“记住”数组现在只包含元素
j
和更高。也就是说,当我们选择subset[0]
为array[k]
时,我们会将array[k]
替换为数组中的第一个元素。当我们选择subset[1]
时,我们认为array[0]
为“死”,我们在1和数组y
之间选择一个随机元素size()
。然后我们将子集[1]设置为等于array[y]
,并将array[y]
设置为等于array [1]。元素0和1现在“死”。Subset[2]
现已从array[2]
到array[array size()]
中选择,依此类推。
我的问题是,如果我们缩小从中选择随机数的数组,那么每个数字被挑选的概率1/remaining_num_elements
。它如何与所有元素保持一致?
答案 0 :(得分:4)
考虑一下,就像你从一包m
个号码中挑选n
个随机数,第一个j
元素代表the numbers in your hand
,其余元素代表{ {1}}。 (正如您的书所示,您将the numbers still in the bag
从0迭代到j
以提取数字。m - 1
然后代表您已从包中取出的整数数。)
如果你在现实生活中从一个包中挑选j
个整数,那么每次你选择一个新的数字时,你只能从包中取出而不是从手中取出。因此,m
在每一步都会收缩。
当你这么想时,应该很容易看出这个方法保证了每个元素被选择的概率相等。
答案 1 :(得分:4)
如果我们缩小我们选择随机数的数组,那么每个数字被选中的概率为1 / remaining_num_elements。
是的,你是对的,1/remaining_num_elements
是元素在特定回合中被拾取的可能性。在这里,我们感兴趣的是一个元素最终在m
轮次中被拾取的概率。对于所有n
元素,它们保持相同。
您需要问的问题是:n
元素中的每一个元素都会在m
轮次中获得公平且平等的机会吗?
答案是肯定的,因为,
P(最终在m
元素集合中获取元素)=
P(元素在第一圈被拾取)+
P(元素在第1回合没有被拾取)* P(元素在第2回合被拾取)+
P(元素在前2回合没有被拾取)* P(元素在第3回合被拾取)+ ...等等
,如果计算,对于最初出现的所有n
元素保持相同。
答案 2 :(得分:0)
你在概率上看到的差异是由于它是条件属性的事实(已经选择了一些事实,并且在最后一次获取中这个元素没有被选中或已经被提取)。但是,选择任何给定球的概率或相等的公平性不会改变。