Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Random 从大小为n的数组中随机生成一组m个整数_Random_Probability - Fatal编程技术网

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
元素,其概率保持不变。

您在概率中看到的差异是由于它是什么样的条件属性(事实上已经选择了某个元素,并且在上一次提取中该元素没有被选择或提取)。然而,总的来说,选择任何一个给定球的概率过高或公平性相等并没有改变