12

我正在为 C++ 程序制作一个 Deck 类。它需要有两种方法:一种是从牌堆顶部弹出一张牌,另一种是洗牌。我关心的是后者。

卡片表示为整数 1 到 52(包括 1 到 52)。洗牌最快的算法是什么(假设随机性“好”水平)?

4

3 回答 3

26

如果你想自己实现洗牌,一个非常简单但功能强大的洗牌算法: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>标头包含。

于 2010-11-02T06:39:58.230 回答
8

std::random_shuffle用来洗牌 。

于 2010-11-02T06:40:31.763 回答
4

std::random_shuffle

http://www.cplusplus.com/reference/algorithm/random_shuffle/

于 2010-11-02T06:40:23.110 回答