【问题标题】:Randomly generate a set of m integers from an array of size n从大小为 n 的数组中随机生成一组 m 个整数
【发布时间】:2012-11-25 04:21:55
【问题描述】:

完整的问题是:

编写一个方法,从大小为n 的数组中随机生成一组 m 个整数。每个元素必须有相同的被选中概率`

这个问题是从“Crack the coding interview”中挑选出来的,答案是这样的:

我们可以将元素与数组开头的元素交换,然后“记住”数组现在只包含 j 和更大的元素。也就是说,当我们选择subset[0]array[k] 时,我们将array[k] 替换为数组中的第一个元素。当我们选择subset[1] 时,我们认为array[0] 是“死的”,我们会在1 和数组size() 之间选择一个随机元素y。然后我们设置subset[1]等于array[y],设置array[y]等于array[1]。元素 0 和 1 现在“死”了。 Subset[2] 现在从 array[2]array[array size()] 中选择,依此类推。

我的问题是,如果我们缩小从中选择随机数的数组,那么每个数字被选择的概率1/remaining_num_elements。它如何对所有元素保持相等?

【问题讨论】:

    标签: random probability


    【解决方案1】:

    想象一下,就像您从一袋n 数字中挑选m 随机数一样,第一个j 元素代表the numbers in your hand,其余元素代表the numbers still in the bag。 (正如您的书所建议的,您将 j 从 0 迭代到 m - 1 以提取数字。然后,j 表示您已经从袋子中提取的整数数量。)

    如果您在现实生活中从一个袋子中挑选m 整数,那么每次您挑选一个新数字时,您只能从袋子中取出,而不是从您的手中。因此,remaining_num_elements 在每一步都会缩小。

    当你这么想的时候,应该很容易看出这个方法保证了每个元素被选中的概率都是相等的。

    【讨论】:

      【解决方案2】:

      如果我们缩小从中选择随机数的数组,那么每个数字被选择的概率为 1/remaining_num_elements。

      是的,你是对的,但1/remaining_num_elements 是一个元素在特定回合中被拾取的概率。在这里,我们对元素最终m 轮次中被选中 的概率感兴趣。对于所有 n 元素,它保持不变。

      您需要问的问题是:n 中的每一个元素在m 回合中是否有公平和平等的机会被选中? 答案是肯定的,因为,

      P(一个元素最终在m元素集合中被拾取) = P(元素在第一回合被捡起) +
      P(元素在第 1 回合未被拾取) * P(元素在第 2 回合被拾取) +
      P(元素在第 1 2 回合未被拾取) * P(元素在第 3 回合被拾取) + ... 以此类推

      如果您计算的话,对于最初存在的所有 n 元素,它保持不变。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-12-15
          • 2014-09-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-09
          • 1970-01-01
          相关资源
          最近更新 更多