第一次知道这个算法,虽然很好理解,但也非常巧妙。
Fisher-Yates 洗牌算法是用来把一个有序数组生成随机排列数组的算法,生成的随机排列都是等概率的。这个算法,通过转换,改变的一直都是随机数的范围,把用过的堆到最后就好了。
代码如下,节选某题的一部分
vector<int> shuffle() {
int size=n.size();
vector<int>ret(n.begin(),n.end());
for(int i=size;i;i--){
swap(ret[random()%i],ret[i-1]);
}
return ret;
}