#pick #probability #random #loot-table

wicker

带有权重的 Rust 概率选择器

2 个不稳定版本

0.2.0 2022年10月11日
0.1.0 2022年5月3日

#1466 in 数学


用于 dialga

MIT 许可证

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