Algorithm 随机洗牌数组

Algorithm 随机洗牌数组,algorithm,shuffle,Algorithm,Shuffle,查看以下用于洗牌数组的算法: def shuffleSort(a): N = len(a) for i in range(N): j = random.randint(0, i) a[j], a[i] = a[i], a[j] 我相信它叫做Fisher-Yates算法?我正在寻找一个严格的数学证明,来证明这是为什么。更具体地说,假设(a1,…,an)是n的排列,我想证明p((x1=a1,…,xn=an))=1/n这是一个典型的归纳证明 归纳假设是,对于k∈ {0,1,…

查看以下用于洗牌数组的算法:

def shuffleSort(a):
  N = len(a)
  for i in range(N):
    j = random.randint(0, i)
    a[j], a[i] = a[i], a[j]

我相信它叫做Fisher-Yates算法?我正在寻找一个严格的数学证明,来证明这是为什么。更具体地说,假设
(a1,…,an)
n
的排列,我想证明
p((x1=a1,…,xn=an))=1/n

这是一个典型的归纳证明

归纳假设是,对于k∈ {0,1,…,n},对于{0,1,…,k的每个置换π− 1} ,概率至少为1/k!,列表值是a(π(0)),a(π(1)),…,a(π(k−1) ,a(k),a(k+1),…,a(n−1) ,其中a(i)表示位置i处的原始值。对于k=n,这证明了每个置换的概率至少为1/n!,这几乎就是我们想要的;其余的是通过观察这些事件是不相交的,并且概率和为一,因此,在任何地方都必须保持相等

基本情况k=0是明显的;只有一个排列,并且它以1/0的概率存在于原始列表中!=1根据假设


对于感应阶跃,设φ=(π(k)k)∘ π、 在英语中,通过将k调回其原始位置来修改π的排列。调用归纳假设,在k之后的列表中存在φ的概率−1步至少为1/(k−1)!. 概率至少为1/k时,随机数为π(k),它以至少1/(k)的概率将所需排列放入列表中−1)! ×1/k=1/k

这是一个典型的归纳证明

归纳假设是,对于k∈ {0,1,…,n},对于{0,1,…,k的每个置换π− 1} ,概率至少为1/k!,列表值是a(π(0)),a(π(1)),…,a(π(k−1) ,a(k),a(k+1),…,a(n−1) ,其中a(i)表示位置i处的原始值。对于k=n,这证明了每个置换的概率至少为1/n!,这几乎就是我们想要的;其余的是通过观察这些事件是不相交的,并且概率和为一,因此,在任何地方都必须保持相等

基本情况k=0是明显的;只有一个排列,并且它以1/0的概率存在于原始列表中!=1根据假设


对于感应阶跃,设φ=(π(k)k)∘ π、 在英语中,通过将k调回其原始位置来修改π的排列。调用归纳假设,在k之后的列表中存在φ的概率−1步至少为1/(k−1)!. 概率至少为1/k时,随机数为π(k),它以至少1/(k)的概率将所需排列放入列表中−1)! ×1/k=1/k

在我写了下面的证明之后,我意识到我们需要假设元素是两两不同的,这条语句才是真的。在我写了下面的证明之后,我意识到我们需要假设元素是两两不同的,这条语句才是真的。