void shuffle(vector<int>& v){
int n = v.size()-1;
while(n){
//从下标[0,n]中随机挑选一个数,和v[n]交换(注意包括v[n]自己)
int k = rand()%(n+1);
swap(v[k],v[n]);
--n;
}
}
为什么下标随机数是[0,n]而不是[0,v.size()-1]呢?
因为前者能够保证每个数字都被选中1次,
而后者是每个数字被选中的数学期望是1次,然而实际上有的数字被选中了2、3、4、5次等,而有的数字被选中了0次,这是不公平的!