3个不稳定版本
0.2.1 | 2022年9月25日 |
---|---|
0.1.1 | 2022年9月16日 |
0.1.0 | 2022年9月13日 |
11 in #deque
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