#slice #pick #random #array #choose

random-pick

根据给定的权重从切片中随机选择一个元素

22个稳定版本

1.2.16 2022年11月4日
1.2.15 2022年3月18日
1.2.14 2021年4月22日
1.2.13 2020年7月29日
1.2.3 2018年11月14日

#338 in 算法

Download history 6607/week @ 2024-03-14 5584/week @ 2024-03-21 6480/week @ 2024-03-28 5454/week @ 2024-04-04 5397/week @ 2024-04-11 5930/week @ 2024-04-18 5654/week @ 2024-04-25 5095/week @ 2024-05-02 7221/week @ 2024-05-09 5761/week @ 2024-05-16 6941/week @ 2024-05-23 6916/week @ 2024-05-30 5836/week @ 2024-06-06 5561/week @ 2024-06-13 6754/week @ 2024-06-20 6012/week @ 2024-06-27

25,527 每月下载量
26 个crate中使用 (2 直接使用)

MIT 许可证

11KB
136

随机选择

CI

根据给定的权重从切片中随机选择一个元素。

示例

enum Prize {
    Legendary,
    Rare,
    Enchanted,
    Common,
}

let prize_list = [Prize::Legendary, Prize::Rare, Prize::Enchanted, Prize::Common]; // available prizes

let slice = &prize_list;
let weights = [1, 5, 15, 30]; // a scale of chance of picking each kind of prize

let n = 1000000;
let mut counter = [0usize; 4];

for _ in 0..n {
    let picked_item = random_pick::pick_from_slice(slice, &weights).unwrap();

    match picked_item {
        Prize::Legendary=>{
            counter[0] += 1;
           }
        Prize::Rare=>{
            counter[1] += 1;
        }
        Prize::Enchanted=>{
            counter[2] += 1;
        }
        Prize::Common=>{
            counter[3] += 1;
        }
    }
}

println!("{}", counter[0]); // Should be close to 20000
println!("{}", counter[1]); // Should be close to 100000
println!("{}", counter[2]); // Should be close to 300000
println!("{}", counter[3]); // Should be close to 600000

切片的长度通常是权重长度的整数倍(大于零)。

如果您有多个切片,您不需要使用额外的空间来连接它们,只需使用 pick_from_multiple_slices 函数,而不是 pick_from_slice

除了从切片或多个切片中选择单个元素之外,您还可以使用 pick_multiple_from_slicepick_multiple_from_multiple_slices 函数。它们的开销低于具有额外循环的非多选函数。

Crates.io

https://crates.io/crates/random-pick

文档

https://docs.rs/random-pick

许可证

MIT

依赖关系

~0.5–1MB
~22K SLoC