我会说,那个狐狸宝宝的回答是错误的。为了证明我将为一个完美的洗牌列表引入一个有用的定义(称它为数组或序列或任何你想要的)。
定义:假设我们有一个列表L,其中包含元素a1, a2 ... an 和索引1, 2, 3..... n。如果我们将L 暴露给洗牌操作(我们无法访问其内部)L 完全洗牌当且仅当通过知道一些 k (k< n) 元素的索引我们不能推断出剩余的n-k 元素。也就是说,剩余的n-k 元素同样有可能在剩余的任何n-k 索引处显示。
示例:如果我们有一个四元素列表[a, b, c, d],并且在对其进行洗牌后,我们知道它的第一个元素是a ([a, .., .., ..]),而不是任何元素b, c, d 出现的概率,假设第三个单元格等于1/3。
现在,算法不满足定义的最小列表具有三个元素。但是算法无论如何都会将其转换为 4 元素列表,因此我们将尝试证明它对于 4 元素列表的不正确性。
考虑一个输入L = [a, b, c, d]在算法的第一次运行之后,L 将分为l1 = [a, c] 和l2 = [b, d]。在将这两个子列表打乱后(但在合并到四元素结果之前),我们可以得到四个同样可能的 2 元素列表:
l1shuffled = [a , c] l2shuffled = [b , d]
l1shuffled = [a , c] l2shuffled = [d , b]
l1shuffled = [c , a] l2shuffled = [b , d]
l1shuffled = [c , a] l2shuffled = [d , b]
现在尝试回答两个问题。
1.合并到最终结果中a 成为列表第一个元素的概率是多少?
简单地说,我们可以看到上面四对中只有两对(同样,同样可能)可以给出这样的结果(p1 = 1/2)。对于这些对中的每一对heads,必须在合并例程的第一次翻转期间绘制 (p2 = 1/2)。因此,a 作为Lshuffled 的第一个元素的概率是p = p1*p2 = 1/4,这是正确的。
2.知道a在Lshuffled的第一个位置,c(我们也可以选择b或d而不失一般性)在@的第二个位置的概率是多少987654351@
现在,根据上述完美洗牌列表的定义,答案应该是1/3,因为列表中剩余的三个单元格中要放入三个数字
让我们看看算法是否能保证这一点。
选择1 作为Lshuffled 的第一个元素后,我们现在将有:
l1shuffled = [c] l2shuffled = [b, d]
或者:
l1shuffled = [c] l2shuffled = [d, b]
在两种情况下选择3 的概率等于翻转heads (p3 = 1/2) 的概率,因此当知道Lshuffled 的第二个元素3 的概率是Lshuffled 的第一个元素是 1 等于 1/2。 1/2 != 1/3 结束了算法不正确的证明。
有趣的是,该算法满足了完美洗牌的必要(但不充分)条件,即:
给定一个 n 元素列表,对于每个索引 k (<n),对于每个元素 ak:在将列表洗牌 m 次之后,如果我们计算了当ak 出现在k 索引上,这个计数将倾向于m/n,而m 倾向于无穷大。