2 个不稳定版本
0.2.0 | 2022年10月11日 |
---|---|
0.1.0 | 2022年5月3日 |
#1466 in 数学
用于 dialga
11KB
174 代码行
柳编
权重概率通常很有用。这个 crate 提供了一个 WeightedPicker
结构体,它相当于一个加权袋子;你可以给它各种权重的条目,然后随机抽取它们。
如果这听起来很熟悉,这就是 Minecraft 财宝表的运作方式。
使用的算法是 Vose 的别名方法(滚动到页面底部),老实说,我完全不理解。但是,它具有 O(n) 的创建时间和 O(1) 的选择时间,对我来说听起来很棒。
WeightedPicker
是静态的;由于使用的算法,创建后无法编辑概率。但是,如果您出于某种原因想要这样做,可以通过 WeightedPicker::pick
方法在创建后编辑每个关联的值。
示例用法
# use wicker::WeightedPicker;
let picker = WeightedPicker::new(vec![
("common", 10.0),
("uncommon", 5.0),
("rare", 2.0),
("legendary", 1.0),
("mythic", 0.1),
]);
let mut rng = rand::thread_rng();
for _ in 0..10 {
println!("- {}", picker.get(&mut rng));
}
示例输出
- 传说
- 罕见
- 不常见
- 常见
- 常见
- 罕见
- 不常见
- 常见
- 常见
- 不常见
依赖
~740KB
~13K SLoC