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种不同情况。那么整个迭代经过排列组合一共会有33=273^3=2733=27种情况,而3个不同的数的全排列一共有3!=63!=63!=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)/n1-(i-1)/n1−(i−1)/n,那么所有数都不相同的概率是:
p=1(1−1n3)(1−2n3)...>=(1−nn3)(1−nn3)...=(1−1n2)n>=1−1n
\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进行排序。
533

被折叠的 条评论
为什么被折叠?



