moonlander_gp/
pick.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
extern crate rand;

/// Randomly pick from a weighted list of alternatives.
#[macro_export]
macro_rules! pick {
    ($rng: expr, $( $weight: expr, $expression: expr),+) => {{
        let total = 0 $(+ $weight)+;
        let mut bound = 0;

        let random_number = $rng.next_u32() % total;
        let result = $( if bound <= random_number && random_number < { bound += $weight; bound } {
            $expression
        } else )+ {
            panic!();
        };
        result
    }}
}