中文背景:随机洗牌
给定一个数组,要求打乱数组顺序,并使得每个元素出现在任何地方的概率都相同。
斗地主版:
对于一个斗地主游戏,给出一个发牌的算法,让每个人的牌确保随机。
即假设由n张牌,要分出来m张牌,给k个人,此时n张牌一共有n! 种排列,需要随机产生一种排列,将排列的前m张牌一次分给k个人。需要使用均匀随机排列洗牌算法,使之能保证,对于n张牌的n! 种排列,得到的任意一种排列的概率都是相同的,即都为 。
验证方法:
- 该算法能产生的排列个数有n! 种
- 每种排列产生的概率相同,即都为1/n!
英文背景:Random Shuffle
Given an array, you need to shuffle the order of the arrays so that each element has the same probability of appearing anywhere.
解法1:(来自STL库, 公平洗牌)
在范围为 [1, n] 的数组中,随机选取一个元素(包括第一个元素),将它与第一个元素进行交换,然后在 [2, n] 中随机选取一个元素,将它与第二个元素进行交换,重复以上过程,直到遍历到最后一个元素。伪代码如下:
for