Random 从大小为n的数组中随机生成一组m个整数
全部问题是: 编写一个方法,从大小为Random 从大小为n的数组中随机生成一组m个整数,random,probability,Random,Probability,全部问题是: 编写一个方法,从大小为n的数组中随机生成一组m个整数。每个元素被选择的概率必须相等` 这个问题选自“破解编码面试”,解决方案如下: 我们可以将该元素与数组开头的元素交换,然后“记住”数组现在只包含j及更大的元素。也就是说,当我们选择子集[0]作为数组[k]时,我们用数组中的第一个元素替换数组[k]。当我们选择子集[1 ] < /代码>时,我们考虑数组[0 ] < /代码>为“死”,我们在1和数组 siz()/之间选择一个随机元素 y>代码>。然后,我们将子集[1]设置为等于arra
n
的数组中随机生成一组m个整数。每个元素被选择的概率必须相等`
这个问题选自“破解编码面试”,解决方案如下:
我们可以将该元素与数组开头的元素交换,然后“记住”数组现在只包含j
及更大的元素。也就是说,当我们选择子集[0]
作为数组[k]
时,我们用数组中的第一个元素替换数组[k]
。当我们选择<代码>子集[1 ] < /代码>时,我们考虑<代码>数组[0 ] < /代码>为“死”,我们在1和数组<代码> siz()/<代码>之间选择一个随机元素<代码> y>代码>。然后,我们将子集[1]设置为等于array[y]
,并将array[y]
设置为等于array[1]。元素0和1现在是“死的”<代码>子集[2]现在从array[2]
到array[array size()]
进行选择,依此类推
我的问题是,如果我们缩小从中拾取随机数的数组,那么每个数被拾取的概率
1/剩余的\u num\u元素
。如何使所有元素保持相等?想象一下,就像你从一袋n
数字中挑选m
随机数一样,第一个j
元素代表你手中的数字
,其余元素代表袋子中的数字
。(正如你的书所建议的那样,你从0到m-1迭代j
,提取数字。j
,然后表示你已经从包中提取的整数的数量。)
如果你在现实生活中从一个袋子里挑选m
整数,那么每次你挑选一个新的数字时,你只能从袋子里挑选,而不是从手上挑选。因此,剩余的
元素在每一步都会收缩
当您以这种方式思考时,应该很容易看出,这种方法保证每个元素被选择的概率相等
如果我们缩小从中选取随机数的数组,则每个数被选取的概率为剩余元素的1/num
是的,你是对的,但是1/剩余的\u num\u元素
是一个元素在特定回合中被拾取的概率。在这里,我们感兴趣的是一个元素最终在m
圈数中被拾取的概率。这对于所有n
元素都是相同的
您需要问的问题是:n
元素中的每一个元素在m
轮次中被拾取的机会是否公平?
答案是肯定的,因为,p(一个元素最终在
m
元素集合中被拾取)=
P(元素在第1轮被拾取)+P(元素在第1轮中未被拾取)*P(元素在第2轮中被拾取)+
P(元素在前两个回合没有被拾取)*P(元素在第三个回合被拾取)+。。。等等
如果您计算,对于最初存在的所有
n
元素,其概率保持不变。您在概率中看到的差异是由于它是什么样的条件属性(事实上已经选择了某个元素,并且在上一次提取中该元素没有被选择或提取)。然而,总的来说,选择任何一个给定球的概率过高或公平性相等并没有改变