我正在为C ++程序制作Deck类。它需要有两种方法:一种是从卡组的顶部弹出卡,另一种是将卡组洗牌。我担心后者。
卡用1到52之间的整数表示。洗牌的最快算法是什么(假设随机性为“良好”水平)?
如果您希望自己实施改组,则可以使用一种非常简单但又实用的改组算法:Fisher–Yates shuffle。
随机排列n个元素的数组: for i from n − 1 downto 1 do j ← random integer with 0 ≤ j ≤ i exchange a[j] and a[i]
随机排列n个元素的数组:
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
<algorithm>