Struct cogs_gamedev::chance::WeightedPicker[][src]

pub struct WeightedPicker<T> { /* fields omitted */ }
Expand description

It’s often helpful to have weighted probabilities. This struct serves as a sort of weighted bag; you can give it entries with various weights, and then randomly sample them.

This is the way Minecraft loot tables work, if this sounds familiar.

The algorithm used is Vose’s Alias Method (scroll to the bottom), which to be honest I absolutely do not understand. But it has O(n) creation and O(1) selection, so sounds good to me.

You can’t edit the probabilities after you’ve created it due to the algorithm.

Implementations

impl<T> WeightedPicker<T>[src]

pub fn new(entries: Vec<(T, f64)>) -> Self[src]

Initialize a WeightedPicker from the given items and weights.

Panics if you pass it an empty Vec.


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));
}

/*
    A sample output:
    - legendary
    - rare
    - uncommon
    - common
    - common
    - rare
    - uncommon
    - common
    - common
    - uncommon
*/

pub fn get<R: Rng + ?Sized>(&self, rng: &mut R) -> &T[src]

Get an item from the list.

pub fn get_idx<R: Rng + ?Sized>(&self, rng: &mut R) -> usize[src]

Get an index into the internal list.

You can use this function to save some space by passing a vec where T is (), if you want usize outputs, I guess.

pub fn pick<R: Rng + ?Sized>(items: Vec<(T, f64)>, rng: &mut R) -> T[src]

The same as creating a WeightedPicker and then calling get, but you don’t need to actually make the WeightedPicker.

Trait Implementations

impl<T: Clone> Clone for WeightedPicker<T>[src]

fn clone(&self) -> WeightedPicker<T>[src]

Returns a copy of the value. Read more

fn clone_from(&mut self, source: &Self)1.0.0[src]

Performs copy-assignment from source. Read more

impl<T: Debug> Debug for WeightedPicker<T>[src]

fn fmt(&self, f: &mut Formatter<'_>) -> Result[src]

Formats the value using the given formatter. Read more

Auto Trait Implementations

impl<T> RefUnwindSafe for WeightedPicker<T> where
    T: RefUnwindSafe

impl<T> Send for WeightedPicker<T> where
    T: Send

impl<T> Sync for WeightedPicker<T> where
    T: Sync

impl<T> Unpin for WeightedPicker<T> where
    T: Unpin

impl<T> UnwindSafe for WeightedPicker<T> where
    T: UnwindSafe

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

pub fn type_id(&self) -> TypeId[src]

Gets the TypeId of self. Read more

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

pub fn borrow(&self) -> &T[src]

Immutably borrows from an owned value. Read more

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

pub fn borrow_mut(&mut self) -> &mut T[src]

Mutably borrows from an owned value. Read more

impl<T> From<T> for T[src]

pub fn from(t: T) -> T[src]

Performs the conversion.

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

pub fn into(self) -> U[src]

Performs the conversion.

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

pub fn to_owned(&self) -> T[src]

Creates owned data from borrowed data, usually by cloning. Read more

pub fn clone_into(&self, target: &mut T)[src]

🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

Uses borrowed data to replace owned data, usually by cloning. Read more

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>[src]

Performs the conversion.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

pub fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>[src]

Performs the conversion.

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

pub fn vzip(self) -> V