Skip to content

Commit 6458662

Browse files
committed
Add better random number functions.
Useful if you want to draw random lines.
1 parent dc84465 commit 6458662

File tree

1 file changed

+24
-7
lines changed

1 file changed

+24
-7
lines changed

src/lib.rs

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ static ARG_COUNT: AtomicUsize = AtomicUsize::new(0);
7070
static ARG_PTR: AtomicPtr<FfiString> = AtomicPtr::new(core::ptr::null_mut());
7171

7272
/// Random number generator state
73-
static RAND_STATE: core::sync::atomic::AtomicU16 = core::sync::atomic::AtomicU16::new(0);
73+
static RAND_STATE: core::sync::atomic::AtomicU32 = core::sync::atomic::AtomicU32::new(0);
7474

7575
// ============================================================================
7676
// Types
@@ -459,17 +459,34 @@ pub fn wait_for_key() -> WaitForKey {
459459
}
460460

461461
/// Seed the 16-bit psuedorandom number generator
462-
pub fn srand(seed: u16) {
462+
pub fn srand(seed: u32) {
463463
RAND_STATE.store(seed, core::sync::atomic::Ordering::Relaxed);
464464
}
465465

466-
/// Get a 16-bit psuedorandom number
467-
pub fn rand() -> u16 {
466+
/// Get a 32-bit psuedorandom number
467+
pub fn rand() -> u32 {
468468
let mut state = RAND_STATE.load(core::sync::atomic::Ordering::Relaxed);
469-
let bit = (state ^ (state >> 2) ^ (state >> 3) ^ (state >> 5)) & 0x01;
470-
state = (state >> 1) | (bit << 15);
469+
state = state.wrapping_mul(1103515245).wrapping_add(12345);
470+
let bits1 = state >> 16;
471+
state = state.wrapping_mul(1103515245).wrapping_add(12345);
472+
let bits2 = state >> 16;
471473
RAND_STATE.store(state, core::sync::atomic::Ordering::Relaxed);
472-
state
474+
(bits1 << 16) | bits2
475+
}
476+
477+
/// Get a random number from a range
478+
pub fn random_in(range: core::ops::Range<u32>) -> u32 {
479+
let count = range.end - range.start;
480+
let bucket_size = u32::MAX / count;
481+
let limit = bucket_size * count;
482+
let rand_value = loop {
483+
let temp = rand() as u32;
484+
if temp <= limit {
485+
break temp;
486+
}
487+
};
488+
let result = rand_value / bucket_size;
489+
result + range.start
473490
}
474491

475492
/// Get the API structure so we can call APIs manually.

0 commit comments

Comments
 (0)