关于洗牌算法的一些理解
关于洗牌,就是随机且等概率的打乱原始的顺序,这里有一种比较好的方法,可以这么思考,有两个集合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个