我正在为 C++ 程序制作一个 Deck 类。它需要有两种方法:一种是从牌堆顶部弹出一张牌,另一种是洗牌。我关心的是后者。
卡片表示为整数 1 到 52(包括 1 到 52)。洗牌最快的算法是什么(假设随机性“好”水平)?
如果你想自己实现洗牌,一个非常简单但功能强大的洗牌算法:Fisher-Yates shuffle。
要对包含 n 个元素的数组 a 进行洗牌:
for i from n − 1 downto 1 do j ← random integer with 0 ≤ j ≤ i exchange a[j] and a[i]
当然,C++ 标准库也为您实现了类似的功能,例如std::random_shuffle
,通过<algorithm>
标头包含。
std::random_shuffle
用来洗牌 。
std::random_shuffle
http://www.cplusplus.com/reference/algorithm/random_shuffle/