5.3-1
把第一种情况单独列出来即可。
5.3-2
无法实现,这个题前面好像有,比如想由A[1,2,3]生成[3,2,1]是无法实现的,因为i是递增的,所以第一步只能和3交换得到[3,2,1],还会进行第二步的交换,生成[3,1,2].所以不能生成任意排列。
5.3-3
这种方法并不能产生均匀的随机排列。
以n=3为例,for循环的每次迭代都会把第i个元素和第[1,2,3]之中的某个进行交换,所以第i次迭代会有3种不同情况。那么整个迭代经过排列组合一共会有
3
3
=
27
3^3=27
33=27种情况,而3个不同的数的全排列一共有
3
!
=
6
3!=6
3!=6种,而27无法整除6,所以产生的排列一定不会是等概率的。
5.3-4
这种做法不会改变元素间的相对位置,而是对整个序列进行了圆周移位。比如:
A=[1,2,3]
offset=1时,B=[3,1,2]
offset=2时,B=[2,3,1]
offset=3时,B=[1,2,3]
永远不会产生[1,3,2]这种情况,所以不是均匀随机排列。
5.3-5
在题中的程序里生成的随机数的范围是[1,n^3],对于第i个数,(假设前i-1个数均不相同),则第i个数唯一的概率是:
1
−
(
i
−
1
)
/
n
1-(i-1)/n
1−(i−1)/n,那么所有数都不相同的概率是:
p
=
1
(
1
−
1
n
3
)
(
1
−
2
n
3
)
.
.
.
>
=
(
1
−
n
n
3
)
(
1
−
n
n
3
)
.
.
.
=
(
1
−
1
n
2
)
n
>
=
1
−
1
n
\begin{aligned} p&=1(1-\frac1{n^3})(1-\frac2{n^3})...\\ &>=(1-\frac{n}{n^3})(1-\frac{n}{n^3})...\\ &=(1-\frac{1}{n^2})^n\\ &>=1-\frac1n \end{aligned}
p=1(1−n31)(1−n32)...>=(1−n3n)(1−n3n)...=(1−n21)n>=1−n1
5.3-6
可以把数组p先赋值为各不相同的数,然后随机交换顺序。
def PERMUTE_BY_SORTING(A):
p=[i for i in range(1,n+1)] #建立一个p数组,内容从1...n
for i in range(1,n+1):
swap p[i] with p[RANDOM(i,n)] #应该自己写出swap和random函数
然后使用关键字对p,对A进行排序。