一尘不染

洗牌

algorithm

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

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


阅读 176

收藏
2020-07-28

共1个答案

一尘不染

如果您希望自己实施改组,则可以使用一种非常简单但又实用的改组算法: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]

当然,C
++标准库也为您实现了类似的功能,例如std::random_shuffle,通过<algorithm>标头包含在内。

2020-07-28