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

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

#1854 in Algorithms

Download history 300/week @ 2024-11-13 170/week @ 2024-11-20 260/week @ 2024-11-27 133/week @ 2024-12-04 327/week @ 2024-12-11 203/week @ 2024-12-18 42/week @ 2024-12-25 162/week @ 2025-01-01 122/week @ 2025-01-08 205/week @ 2025-01-15 145/week @ 2025-01-22 103/week @ 2025-01-29 150/week @ 2025-02-05 239/week @ 2025-02-12 117/week @ 2025-02-19 208/week @ 2025-02-26

732 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