Monday, August 16, 2010

一个错误的产生随机排列的算法

对元素两两互不相同的数组A[n]进行随机排列,使得到的每一个排列的概率相等,都是1/n!。
一个错误的做法是:
for (int i = 0; i < n; i++)
{
int j = rand(0, n); // generate a random integer in the interval: [0, n)
swap(a[i], a[j]);
}
错误原因分析:
这 个过程中产生的j序列构成了{0, 1, ..., n-1}^n空间中的一个点,这个空间中的点数为n^n。每一个这样的点对应唯一的一个A的排列。因此,每一个A的排列都对应m个{0, 1, ..., n-1}^n空间中的点。因此:
1/n! = m / n^n,于是m = n^n/n!,m是个整数。但对于一个一般的n是不成立的,比如n = 3。
从而上述产生的随机排列并不是概率均匀的。

No comments:

Post a Comment