关于洗牌算法的一些理解

关于洗牌,就是随机且等概率的打乱原始的顺序,这里有一种比较好的方法,可以这么思考,有两个集合A,B,A是原始数据,每一次随机选取A中的一个元素,依次放到B中,那么最后A为空,B的顺序就对应了一次洗牌,具体的实现不需要两个数组,首先从A的1...n的范围内选一个数与A[1]交换,然后从2..n中选一个数与A[2]交换..这样就相当于把每一次选中的数字放到了B里面,而且下一次选择的时候一定不会选到之前出现的数字了,所以代码如下:

1 void suffle(int n)
2 {
3       for(int i=1;i<=n;i++)
4          {
5                 int j=rand(i,n);
6                 swap(a[i],a[j]);
7          }    
8 }

特别的,当对前k个位置确定之后相当于随机的在n个元素中选出了k个

posted @ 2012-09-17 22:32  xpray  阅读(209)  评论(0编辑  收藏  举报