Java 大小为n的数组中的m个整数的集合

Java 大小为n的数组中的m个整数的集合,java,arrays,random,collections,set,Java,Arrays,Random,Collections,Set,编写一个方法,从大小为n的数组中随机生成一组m个整数。每个元素被选择的概率必须相等。 这是一个相当有名的问题——在多本书和采访中都有提到——但要么我没有正确地阅读这个问题,要么对我来说,这个问题的要求实际上无法在Java中同时得到满足 假设有一个大小为n=3的数组 Integer[]ar={1,1,5} 如果w为随机生成的集合选择了m=2,我看不出我们如何保证每个元素被选择的概率相等 换句话说,从给定的大小为3的数组中请求一个由2个整数组成的Java集合,使得不可能确保每个元素的概率相等。举例来

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

这是一个相当有名的问题——在多本书和采访中都有提到——但要么我没有正确地阅读这个问题,要么对我来说,这个问题的要求实际上无法在Java中同时得到满足

假设有一个大小为n=3的数组

Integer[]ar={1,1,5}

如果w为随机生成的集合选择了m=2,我看不出我们如何保证每个元素被选择的概率相等

换句话说,从给定的大小为3的数组中请求一个由2个整数组成的Java集合,使得不可能确保每个元素的概率相等。举例来说,如果我们将[0]a、[1]b、[2]c称为[0]a、[1]b、[2]c,那么随机选择的所有2个元素组合(移除)将如下所示:

  • ab
  • ba
  • 交流电
  • 卑诗省
  • ca
  • cb
  • 由于选项1)和2)会自动使Java中集合的唯一元素要求无效,因此在这种特殊情况下,元素“c”即数字5如果我们最终得到一组2个元素,则其概率始终为100%

    我想,如果数组只包含重复项,即{1,1,1},那么说明这个问题就更容易了,那么一组m=2整数就不可能了


    关于这个问题,我是否有误解或误解。

    老实说,你的问题是不清楚的,即使你尽力解释。你能再试一次吗?另一方面,它们可能不是指一个集,而是数学意义上的集。如果它是一个集(如果你想在数学意义上),那么它不能两次包含一个元素。但是,它可以包含两个不同的元素,表示同一个整数。@Gendarme:我的整个问题都是试图以书面形式回答这个问题(我没有制作或编辑这个问题,它是逐字逐句地复制的,正如在多本书中所写的那样)。在监考人无法提供澄清的情况下,任何人都可以在考试中阅读。我对这类问题的全部问题是,理论上它可以测试两种截然不同的东西:数据结构的知识(洗牌算法)或Java集合的理解(集合只包含唯一的、未排序的值)。我的观点是:如果必须使Elemebt“唯一”,那么就违反了约束,即它是一个集合。(一个集合不知道重复项)。所以{1,1,1}=={1}=={1,1}和{1}+{1}={1}也就是说,第一步是定义什么是“元素”。在这个问题中,它是混合的:a)数组的元素(即索引中的对象),b)集合的元素(即集合的元素)c)不同的值(即1,2,3…)。这样问题可能会变得更容易(“命名并征服”)。老实说,你的问题是不清楚的,即使你尽力解释它。你能再试一次吗?另一方面,它们可能不是指一个集,而是数学意义上的集。如果它是一个集(如果你想在数学意义上),那么它不能两次包含一个元素。但是,它可以包含两个不同的元素,表示同一个整数。@Gendarme:我的整个问题都是试图以书面形式回答这个问题(我没有制作或编辑这个问题,它是逐字逐句地复制的,正如在多本书中所写的那样)。在监考人无法提供澄清的情况下,任何人都可以在考试中阅读。我对这类问题的全部问题是,理论上它可以测试两种截然不同的东西:数据结构的知识(洗牌算法)或Java集合的理解(集合只包含唯一的、未排序的值)。我的观点是:如果必须使Elemebt“唯一”,那么就违反了约束,即它是一个集合。(一个集合不知道重复项)。所以{1,1,1}=={1}=={1,1}和{1}+{1}={1}也就是说,第一步是定义什么是“元素”。在这个问题中,它是混合的:a)数组的元素(即索引中的对象),b)集合的元素(即集合的元素)c)不同的值(即1,2,3…)。有了这一点,问题可能会变得更容易(“命名和征服”)。