#algorithm #shuffling #random #slice #fisher-yates #shuffler #irs

shuffle

Implementation of various shuffling algorithms over slices

6 releases

0.1.7 Sep 30, 2021
0.1.6 Sep 29, 2021
0.1.3 Oct 2, 2019

#1690 in Algorithms

Download history 140/week @ 2024-07-19 125/week @ 2024-07-26 179/week @ 2024-08-02 208/week @ 2024-08-09 199/week @ 2024-08-16 125/week @ 2024-08-23 100/week @ 2024-08-30 103/week @ 2024-09-06 211/week @ 2024-09-13 186/week @ 2024-09-20 220/week @ 2024-09-27 206/week @ 2024-10-04 185/week @ 2024-10-11 190/week @ 2024-10-18 166/week @ 2024-10-25 121/week @ 2024-11-01

688 downloads per month
Used in 10 crates (6 directly)

MIT license

12KB
201 lines

shuffle

Various shuffling algorithms for rust.

Currently implemented shuffling algorithms

  • Inverse Riffle Shuffle
  • Fisher-Yates
  • ... ? TODO

Examples

use shuffle::shuffler::Shuffler;
use shuffle::irs::Irs;
use rand::rngs::mock::StepRng;

let mut rng = StepRng::new(2, 13);
let mut irs = Irs::default();
let mut input = vec![1, 2, 3, 4, 5];

irs.shuffle(&mut input, &mut rng);
assert_eq!(&input, &[4, 1, 5, 3, 2]);

lib.rs:

Crate implementing various kinds of shuffling algorithms such as Inverse Riffle Shuffle (more algorithms coming soon).

Why

Currently, the most common way of shuffling a collection is by using rand::shuffle, which is basically Fisher-Yates algorithm. This is nice, but it requires that you have a good source of random numbers in an arbitrary range.

This crate aims to provide good abstractions to shuffle collections when all you have is just a source of randomness. (but we also implement Fisher-Yates, because why not?)

Assuming that the source of the randomness is good, all of the shuffling algorithms return a permutation from a uniform distribution.

Example

use shuffle::shuffler::Shuffler;
use shuffle::irs::Irs;
use rand::rngs::mock::StepRng;

let mut rng = StepRng::new(2, 13);
let mut irs = Irs::default();

let mut input = vec![1, 2, 3, 4, 5];

irs.shuffle(&mut input, &mut rng);
assert_eq!(&input, &[4, 1, 5, 3, 2]);

Dependencies

~1MB
~26K SLoC