洗牌算法

缘起

造对拍数据的时候有可能用到

分析

每次随机产生两个索引, 然后交换之.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void shuffle(int *a, int lb,int ub) // 对 a[lb,...,ub] 进行随机洗牌
{
srand(time(0));
int len = ub -lb+1;
for (int k = 0; k<500; k++) // 500次洗牌,应该比较充分了
{
int i = lb + rand()%len;
int j = lb + rand()%len;
if (i==j) continue; // 注意, 一定不能省略这个, 不然的话, a和a之间通过异或运算交换是不行的
a[i] = a[i]^a[j];
a[j] = a[i]^a[j];
a[i] = a[i]^a[j];
}

}