问题
给定一个数组(牌),要求打乱数组顺序。打乱后,数组的所有排列是等可能的(或者每个元素出现在任何地方的概率是相等的)
洗牌算法
给定一个长度为
n
n
n的数组nums
,从前向后填充考虑每一位填充的元素。比如考虑第i
位的元素:
- 随机生成一个
[
i
,
n
)
[i,n)
[i,n)之间的一个数字
idx
,idx
所指向的元素就是第i
位所放置的元素。 - 为防止原有的第
i
位的元素被覆盖掉,可以交换第i
位的元素和第idx
元素,即swap(nums[i],nums[idx])
。
代码
for(int i = 0;i < n;++ i){
int idx = rand() % (n - i) + i;
swap(nums[idx],nums[i]);
}