经典随机洗牌算法
int s[MAXN];
for(int i = 0; i < MAXN; i ++) {
int k = rand() % (i + 1);
if(k != i) swap(s[i], s[k]);
}
证明
令当前的数的个数为
Z
,序号从
当 Z=1 时,满足条件,概率为 11
设 Z=K 时,满足条件,每一个数出现在任意位置的概率为 1K
当 Z=K+1 时,由于第 K+1 张牌出现在任意位置的概率为 1K+1 ,当我的第 K+1 张牌位置发生变化时,肯定会改变状态 Z=K 的序列,所以这 K 个数要保持原来的位置概率即为
1−1K+1 ,然后由于 Z=K 时,每一个数出现在任意位置的概率为 1K ,所以针对 Z=K+1 时,概率就是 1K×(1−1K+1)=1K+1 ,所以是随机性的