Trait bones_framework::lib::ecs::prelude::TurboRand

source ·
pub trait TurboRand: TurboCore + GenCore {
Show 35 methods // Provided methods fn u128(&self, bounds: impl RangeBounds<u128>) -> u128 { ... } fn i128(&self, bounds: impl RangeBounds<i128>) -> i128 { ... } fn u64(&self, bounds: impl RangeBounds<u64>) -> u64 { ... } fn i64(&self, bounds: impl RangeBounds<i64>) -> i64 { ... } fn u32(&self, bounds: impl RangeBounds<u32>) -> u32 { ... } fn i32(&self, bounds: impl RangeBounds<i32>) -> i32 { ... } fn u16(&self, bounds: impl RangeBounds<u16>) -> u16 { ... } fn i16(&self, bounds: impl RangeBounds<i16>) -> i16 { ... } fn u8(&self, bounds: impl RangeBounds<u8>) -> u8 { ... } fn i8(&self, bounds: impl RangeBounds<i8>) -> i8 { ... } fn usize(&self, bounds: impl RangeBounds<usize>) -> usize { ... } fn isize(&self, bounds: impl RangeBounds<isize>) -> isize { ... } fn f32(&self) -> f32 { ... } fn f32_normalized(&self) -> f32 { ... } fn f64(&self) -> f64 { ... } fn f64_normalized(&self) -> f64 { ... } fn index(&self, bound: impl RangeBounds<usize>) -> usize { ... } fn bool(&self) -> bool { ... } fn chance(&self, rate: f64) -> bool { ... } fn sample<'a, T>(&self, list: &'a [T]) -> Option<&'a T> { ... } fn sample_iter<T>(&self, list: T) -> Option<<T as Iterator>::Item> where T: Iterator { ... } fn sample_mut<'a, T>(&self, list: &'a mut [T]) -> Option<&'a mut T> { ... } fn sample_multiple<'a, T>(&self, list: &'a [T], amount: usize) -> Vec<&'a T> { ... } fn sample_multiple_mut<'a, T>( &self, list: &'a mut [T], amount: usize, ) -> Vec<&'a mut T> { ... } fn sample_multiple_iter<T>( &self, list: T, amount: usize, ) -> Vec<<T as Iterator>::Item> where T: Iterator { ... } fn weighted_sample<'a, T, F>( &self, list: &'a [T], weight_sampler: F, ) -> Option<&'a T> where F: Fn((&T, usize)) -> f64 { ... } fn weighted_sample_mut<'a, T, F>( &self, list: &'a mut [T], weight_sampler: F, ) -> Option<&'a mut T> where F: Fn((&T, usize)) -> f64 { ... } fn shuffle<T>(&self, slice: &mut [T]) { ... } fn partial_shuffle<'a, T>( &self, slice: &'a mut [T], amount: usize, ) -> (&'a mut [T], &'a mut [T]) { ... } fn alphabetic(&self) -> char { ... } fn alphanumeric(&self) -> char { ... } fn lowercase(&self) -> char { ... } fn uppercase(&self) -> char { ... } fn digit(&self, radix: u8) -> char { ... } fn char(&self, bounds: impl RangeBounds<char>) -> char { ... }
}
Expand description

Extension trait for automatically implementing all TurboRand methods, as long as the struct implements TurboCore & GenCore. All methods are provided as default implementations that build on top of TurboCore and GenCore, and thus are not recommended to be overridden, lest you potentially change the expected outcome of the methods.

Provided Methods§

source

fn u128(&self, bounds: impl RangeBounds<u128>) -> u128

Returns a random u128 within a given range bound.

§Panics

Panics if the range is empty or invalid.

source

fn i128(&self, bounds: impl RangeBounds<i128>) -> i128

Returns a random i128 within a given range bound.

§Panics

Panics if the range is empty or invalid.

source

fn u64(&self, bounds: impl RangeBounds<u64>) -> u64

Returns a random u64 value.

§Panics

Panics if the range is empty or invalid.

source

fn i64(&self, bounds: impl RangeBounds<i64>) -> i64

Returns a random i64 value.

§Panics

Panics if the range is empty or invalid.

source

fn u32(&self, bounds: impl RangeBounds<u32>) -> u32

Returns a random u32 value.

§Panics

Panics if the range is empty or invalid.

source

fn i32(&self, bounds: impl RangeBounds<i32>) -> i32

Returns a random i32 value.

§Panics

Panics if the range is empty or invalid.

source

fn u16(&self, bounds: impl RangeBounds<u16>) -> u16

Returns a random u16 value.

§Panics

Panics if the range is empty or invalid.

source

fn i16(&self, bounds: impl RangeBounds<i16>) -> i16

Returns a random i16 value.

§Panics

Panics if the range is empty or invalid.

source

fn u8(&self, bounds: impl RangeBounds<u8>) -> u8

Returns a random u8 value.

§Panics

Panics if the range is empty or invalid.

source

fn i8(&self, bounds: impl RangeBounds<i8>) -> i8

Returns a random i8 value.

§Panics

Panics if the range is empty or invalid.

source

fn usize(&self, bounds: impl RangeBounds<usize>) -> usize

Returns a random usize within a given range bound.

§Panics

Panics if the range is empty or invalid.

source

fn isize(&self, bounds: impl RangeBounds<isize>) -> isize

Returns a random isize within a given range bound.

§Panics

Panics if the range is empty or invalid.

source

fn f32(&self) -> f32

Returns a random f32 value between 0.0 and 1.0.

source

fn f32_normalized(&self) -> f32

Returns a random f32 value between -1.0 and 1.0.

source

fn f64(&self) -> f64

Returns a random f32 value between 0.0 and 1.0.

source

fn f64_normalized(&self) -> f64

Returns a random f32 value between -1.0 and 1.0.

source

fn index(&self, bound: impl RangeBounds<usize>) -> usize

Returns a usize value for stable indexing across different word size platforms.

source

fn bool(&self) -> bool

Returns a random boolean value.

§Example
use turborand::prelude::*;

let rng = Rng::with_seed(Default::default());

assert_eq!(rng.bool(), true);
source

fn chance(&self, rate: f64) -> bool

Returns a boolean value based on a rate. rate represents the chance to return a true value, with 0.0 being no chance and 1.0 will always return true.

§Panics

Will panic if rate is not a value between 0.0 and 1.0.

§Example
use turborand::prelude::*;

let rng = Rng::with_seed(Default::default());

assert_eq!(rng.chance(1.0), true);
source

fn sample<'a, T>(&self, list: &'a [T]) -> Option<&'a T>

Samples a random item from a slice of values.

§Example
use turborand::prelude::*;

let rng = Rng::with_seed(Default::default());

let values = [1, 2, 3, 4, 5, 6];

assert_eq!(rng.sample(&values), Some(&5));
source

fn sample_iter<T>(&self, list: T) -> Option<<T as Iterator>::Item>
where T: Iterator,

Samples a random item from an iterator of values. O(1) if the iterator provides an accurate Iterator::size_hint to allow for optimisations to kick in, else O(n) where n is the size of the iterator.

§Example
use turborand::prelude::*;

let rng = Rng::with_seed(Default::default());

let mut values = [1, 2, 3, 4, 5, 6];

assert_eq!(rng.sample_iter(values.iter_mut()), Some(&mut 5));
source

fn sample_mut<'a, T>(&self, list: &'a mut [T]) -> Option<&'a mut T>

Samples a random &mut item from a slice of values.

NOTE: Mutable references must be dropped before more can be sampled from the source slice. If a sampling tries to yield a mutable reference that already exists, the compiler will complain.

§Example
use turborand::prelude::*;

let rng = Rng::with_seed(Default::default());

let mut values = [1, 2, 3, 4, 5, 6];

let result1 = rng.sample_mut(&mut values);

assert_eq!(result1, Some(&mut 5));

let result2 = rng.sample_mut(&mut values);

assert_eq!(result2, Some(&mut 3));
source

fn sample_multiple<'a, T>(&self, list: &'a [T], amount: usize) -> Vec<&'a T>

Samples multiple unique items from a slice of values.

§Example
use turborand::prelude::*;

let rng = Rng::with_seed(Default::default());

let values = [1, 2, 3, 4, 5, 6];

assert_eq!(rng.sample_multiple(&values, 2), vec![&6, &4]);
source

fn sample_multiple_mut<'a, T>( &self, list: &'a mut [T], amount: usize, ) -> Vec<&'a mut T>

Samples multiple unique items from a mutable slice of values.

NOTE: Mutable references must be dropped before more can be sampled from the source slice. If a sampling tries to yield a mutable reference that already exists, the compiler will complain.

§Example
use turborand::prelude::*;

let rng = Rng::with_seed(Default::default());

let mut values = [1, 2, 3, 4, 5, 6];

assert_eq!(rng.sample_multiple_mut(&mut values, 2), vec![&mut 6, &mut 4]);
source

fn sample_multiple_iter<T>( &self, list: T, amount: usize, ) -> Vec<<T as Iterator>::Item>
where T: Iterator,

Samples multiple unique items from an iterator of values.

§Example
use turborand::prelude::*;

let rng = Rng::with_seed(Default::default());

let values = [1, 2, 3, 4, 5, 6];

assert_eq!(rng.sample_multiple_iter(values.iter(), 2), vec![&6, &4]);
source

fn weighted_sample<'a, T, F>( &self, list: &'a [T], weight_sampler: F, ) -> Option<&'a T>
where F: Fn((&T, usize)) -> f64,

Stochastic Acceptance implementation of Roulette Wheel weighted selection. Uses a closure to return a rate value for each randomly sampled item to decide whether to return it or not. The returned f64 value must be between 0.0 and 1.0.

Returns None if given an empty list to sample from. For a list containing 1 item, it’ll always return that item regardless. Otherwise, operations are O(1) in complexity, and require no allocations.

§Panics

If the returned value of the weight_sampler closure is not between 0.0 and 1.0.

§Example
use turborand::prelude::*;

let rng = Rng::with_seed(Default::default());

let values = [1, 2, 3, 4, 5, 6];

let total = f64::from(values.iter().sum::<i32>());

assert_eq!(rng.weighted_sample(&values, |(&item, _)| item as f64 / total), Some(&4));
source

fn weighted_sample_mut<'a, T, F>( &self, list: &'a mut [T], weight_sampler: F, ) -> Option<&'a mut T>
where F: Fn((&T, usize)) -> f64,

Stochastic Acceptance implementation of Roulette Wheel weighted selection. Uses a closure to return a rate value for each randomly sampled item to decide whether to return it or not. The returned f64 value must be between 0.0 and 1.0.

Returns None if given an empty list to sample from. For a list containing 1 item, it’ll always return that item regardless. Otherwise, operations are O(1) in complexity, and require no allocations.

NOTE: Mutable references must be dropped before more can be sampled from the source slice. If a sampling tries to yield a mutable reference that already exists, the compiler will complain.

§Panics

If the returned value of the weight_sampler closure is not between 0.0 and 1.0.

§Example
use turborand::prelude::*;

let rng = Rng::with_seed(Default::default());

let mut values = [1, 2, 3, 4, 5, 6];

let total = f64::from(values.iter().sum::<i32>());

let result1 = rng.weighted_sample_mut(&mut values, |(&item, _)| item as f64 / total);

assert_eq!(result1, Some(&mut 4));

let result2 = rng.weighted_sample_mut(&mut values, |(&item, _)| item as f64 / total);

assert_eq!(result2, Some(&mut 5));

// We have to drop `result2` because the next sample will try to return the same
// value again. And rust won't allow two mutable references to exist at the same
// time
drop(result2);

let result3 = rng.weighted_sample_mut(&mut values, |(&item, _)| item as f64 / total);

// Weighted sample in this example will favour larger numbers, so 5 gets picked
// again.
assert_eq!(result3, Some(&mut 5));
source

fn shuffle<T>(&self, slice: &mut [T])

Shuffles a slice randomly in O(n) time.

§Example
use turborand::prelude::*;

let rng = Rng::with_seed(Default::default());

let values = [1, 2, 3, 4, 5];
let mut shuffled = values.clone();

rng.shuffle(&mut shuffled);

assert_ne!(&shuffled, &values);
source

fn partial_shuffle<'a, T>( &self, slice: &'a mut [T], amount: usize, ) -> (&'a mut [T], &'a mut [T])

Partially shuffles a slice by a given amount and returns the shuffled part and non-shuffled part.

§Example
use turborand::prelude::*;

let rng = Rng::with_seed(Default::default());

let mut values = [1, 2, 3, 4, 5];

let (shuffled, rest) = rng.partial_shuffle(&mut values, 2);

assert_eq!(shuffled, &mut [2, 5]);
assert_eq!(rest, &mut [1, 4, 3]);
source

fn alphabetic(&self) -> char

Generates a random char in ranges a-z and A-Z.

source

fn alphanumeric(&self) -> char

Generates a random char in ranges a-z, A-Z and 0-9.

source

fn lowercase(&self) -> char

Generates a random char in the range a-z.

source

fn uppercase(&self) -> char

Generates a random char in the range A-Z.

source

fn digit(&self, radix: u8) -> char

Generate a random digit in the given radix.

Digits are represented by chars in ranges 0-9 and a-z.

§Example
use turborand::prelude::*;

let rand = Rng::with_seed(Default::default());

let digit = rand.digit(16);

assert_eq!(&digit, &'2');
§Panics

Panics if the radix is zero or greater than 36.

source

fn char(&self, bounds: impl RangeBounds<char>) -> char

Generates a random char in the given range.

§Example
use turborand::prelude::*;

let rand = Rng::with_seed(Default::default());

let character = rand.char('a'..'Ç');

assert_eq!(character, '»');
§Panics

Panics if the range is empty.

Object Safety§

This trait is not object safe.

Implementors§

source§

impl<T> TurboRand for T
where T: TurboCore + GenCore + ?Sized,