我正在为一个C++程序制作一种牌组类。它需要有两个方法:一个用于从顶部弹出一张卡牌,另一个用于洗牌。我关注后者。
卡牌被表示为整数1到52(包括52)。假设水平良好,最快的洗牌算法是什么?
要对包含n个元素的数组a进行洗牌:
for i from n − 1 downto 1 do
j ← random integer with 0 ≤ j ≤ i
exchange a[j] and a[i]
当然,C++标准库也已经为你实现了这样的功能,例如通过<algorithm>
头文件包含的std::random_shuffle
。std::random_shuffle
来洗牌。std::random_shuffle
http://www.cplusplus.com/reference/algorithm/random_shuffle/
a[0]
的概率很高是相同的值?为什么不用downto 0
? - Hanj = 0
,则可以在循环的任何迭代中交换a[0]
。如果i
等于零,则j
也必须等于零(因为循环体的第一行将j
设置为小于或等于零的随机整数),这不会改变排序。 - Amber