#algorithm #shuffling #slice #random #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

#1729 in Algorithms

Download history 149/week @ 2023-11-20 167/week @ 2023-11-27 79/week @ 2023-12-04 80/week @ 2023-12-11 184/week @ 2023-12-18 61/week @ 2023-12-25 38/week @ 2024-01-01 77/week @ 2024-01-08 107/week @ 2024-01-15 70/week @ 2024-01-22 60/week @ 2024-01-29 61/week @ 2024-02-05 125/week @ 2024-02-12 95/week @ 2024-02-19 125/week @ 2024-02-26 129/week @ 2024-03-04

484 downloads per month
Used in 9 crates (5 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