#deck #cards #deque #shuffling

deque_deck

一个用于操作和洗牌的简单牌组库

3个不稳定版本

0.2.1 2022年9月25日
0.1.1 2022年9月16日
0.1.0 2022年9月13日

11 in #deque

MIT许可

26KB
525

deque_deck

此crate提供了一个简单的接口,用于创建和操作一个完全通用的牌组。

用法

将此添加到您的 Cargo.toml

[dependencies]
deque_deck = "0.1.1"

标准deque数据结构的操作可用,但为了方便,已重命名以反映用于牌组的语言。因此,“抽牌”代替“弹出”,“切牌”代替“左旋转”等。

洗牌

支持各种洗牌算法。如果需要随机化质量,则应仅使用shuffle()方法。所有其他方法要么是为了模拟物理洗牌方法,要么只是出于数学上的兴趣。为了实现随机化模拟洗牌,需要多次调用。

标准(Fisher-Yates)

默认洗牌方法使用Fisher-Yates算法,该算法给每张牌在任意位置结束的平等概率。

let mut deck = Deck::<i32>::from_iter(0..10);
deck.shuffle();
// Deck{ [1, 9, 7, 6, 2, 8, 4, 5, 0, 3] }

扇形洗牌(Gibert-Shannon-Reeds)

扇形洗牌方法使用Gibert-Shannon-Reeds算法在牌组中间选择一个点(使用二项分布),然后分割牌组并混合两个半部分。

let mut deck = Deck::<i32>::from_iter(0..10);
deck.riffle();
// Deck{ [5, 6, 0, 7, 1, 8, 2, 3, 4, 9] }

翻牌洗牌(Pemantle)

翻牌洗牌方法使用Pemantle算法从顶部取出一组牌,并将其依次放在底部。下一组牌的末尾是卡片的概率由参数n给出。

let mut deck = Deck::<i32>::from_iter(0..10);
deck.overhand(0.4);
// Deck{ [9, 7, 8, 6, 3, 4, 5, 1, 2, 0] }

堆叠洗牌

将牌组中的牌分成n堆,然后以随机顺序堆叠这些堆。尽管很受欢迎,但这提供了极差的随机化。

let mut deck = Deck::<i32>::from_iter(0..10);
deck.pile_shuffe(3);
// Deck{ [8, 5, 2, 7, 4, 1, 9, 6, 3, 0] }

吉尔布雷思洗牌

吉尔布雷思洗牌从牌组顶部抽出n张牌,然后对这两组牌进行扇形洗牌。

let mut deck = Deck::<i32>::from_iter(0..10);
deck.gilbreath(5);
// Deck{ [5, 6, 4, 7, 8, 3, 2, 9, 1, 0] }

其他洗牌

逆扇形洗牌和原始Pemantle洗牌可用于统计目的,但它们不代表任何实际的洗牌技术。法罗洗牌也提供了,尽管它不是真正的洗牌,但它与扇形洗牌密切相关。

依赖关系

~1MB
~23K SLoC