从大小为n的数组中随机生成一组m个整数

时间:2012-12-07 01:14:45

标签: random probability

完整问题是:

  

编写一个方法,从大小为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。它如何与所有元素保持一致?

3 个答案:

答案 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)

你在概率上看到的差异是由于它是条件属性的事实(已经选择了一些事实,并且在最后一次获取中这个元素没有被选中或已经被提取)。但是,选择任何给定球的概率或相等的公平性不会改变。