Skip to content

Commit 75fcde9

Browse files
authored
Add fisher yates shuffle (#394)
1 parent 5bb80cd commit 75fcde9

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

src/general/fisher_yates_shuffle.rs

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
use std::time::{SystemTime, UNIX_EPOCH};
2+
3+
use crate::math::PCG32;
4+
5+
const DEFAULT: u64 = 4294967296;
6+
7+
fn gen_range(range: usize, generator: &mut PCG32) -> usize {
8+
generator.get_u64() as usize % range
9+
}
10+
11+
pub fn fisher_yates_shuffle(array: &mut [i32]) {
12+
let seed = match SystemTime::now().duration_since(UNIX_EPOCH) {
13+
Ok(duration) => duration.as_millis() as u64,
14+
Err(_) => DEFAULT,
15+
};
16+
17+
let mut random_generator = PCG32::new_default(seed);
18+
19+
let len = array.len();
20+
21+
for i in 0..(len - 2) {
22+
let r = gen_range(len - i, &mut random_generator);
23+
array.swap(i, i + r);
24+
}
25+
}

src/general/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
mod convex_hull;
2+
mod fisher_yates_shuffle;
23
mod hanoi;
34
mod huffman_encoding;
45
mod kmeans;
56
mod nqueens;
67
mod two_sum;
78

89
pub use self::convex_hull::convex_hull_graham;
10+
pub use self::fisher_yates_shuffle::fisher_yates_shuffle;
911
pub use self::hanoi::hanoi;
1012
pub use self::huffman_encoding::{HuffmanDictionary, HuffmanEncoding};
1113
pub use self::kmeans::f32::kmeans as kmeans_f32;

0 commit comments

Comments
 (0)