随机打乱一个数组的算法
给定一个数组,要求你把数组的顺序随机打乱,然后输出,主要是要保证效率。
这个算法其实简单,首先从所有元素中选取一个数与第一个进行交换,然后在2至n中选择一个元素与第二个交换,直到最后一个元素。
这样能确保每个元素在每个位置的概率都是1/n。代码如下:
#include
#include
#include
// 随机打乱一个数组
void random(int a[], int n)
{
int index, tmp, i;
srand(time(NULL));
for (i = 0; i
概率分析(证明):每个元素在第一个的位置是1/n,这是毫无疑问的。第一次交换时,一个元素不在第一个位置的概率是(n-1)/n。所以当第二次交换时,一个元素在第二个位置的概率是(n-1)/n*1/n-1=1/n。同时,一个元素不在第一个第二位置的概率是多少呢?很显然是1-1/n-1/n=(n-2)/n。那么在第三次交换时,一个元素在第三个位置的概率就是(n-2)/n*1/(n-2)=1/n。依此类推……
ps:当然你也可以反着来,首先从1...n中随机选取一个元素与第n个交换,然后从1...n-1中随机选取一个元素与第n-1个交换,依此类推……
![Creative Commons License](http://i.creativecommons.org/l/by/2.5/cn/88x31.png)
本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名小橋流水(包含链接)。如您有任何疑问或者授权方面的协商,请给我发邮件。