This commit is contained in:
2017-09-02 16:27:08 +02:00
commit 850eea5bc5
4 changed files with 45 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
target/
**/*.rs.bk
Cargo.lock

6
Cargo.toml Normal file
View File

@@ -0,0 +1,6 @@
[package]
name = "permute"
version = "0.1.0"
authors = ["hellerve <veit@veitheller.de>"]
[dependencies]

4
README.md Normal file
View File

@@ -0,0 +1,4 @@
# permute
A Rust implementation of the unique random integer generation described
[here](http://preshing.com/20121224/how-to-generate-a-sequence-of-unique-random-integers/).

32
src/lib.rs Normal file
View File

@@ -0,0 +1,32 @@
pub struct RandomSeq {
idx: u32,
offs: u32,
}
fn permute_qpr(i: u32) -> u32 {
let x = i as u64;
let prime = 4294967291;
if x >= prime { return x as u32; }
let residue = (x * x) % prime;
if x <= prime / 2 {
return residue as u32;
}
return (prime - residue) as u32;
}
impl RandomSeq {
pub fn new(base: u32, offset: u32) -> RandomSeq {
RandomSeq {
idx: permute_qpr(permute_qpr(base) + 0x682f0161),
offs: permute_qpr(permute_qpr(offset) + 0x46790905),
}
}
pub fn next(&mut self) -> u32 {
let res = permute_qpr((permute_qpr(self.idx) + self.offs) ^ 0x5bf03635);
self.idx += 1;
return res;
}
}