crand::next_u64() now correctly returns uniformly between 0..=RANGE_MAX

Fortune for cpprng's current commit: Small blessing − 小吉
lib
Avril 3 years ago
parent b59c0671d2
commit c21c7e77e9
Signed by: flanchan
GPG Key ID: 284488987C31F630

@ -1,6 +1,7 @@
#include <bit>
#include <climits>
#include <cmath>
#include <rng.h>
#include <mem.h>
@ -30,7 +31,7 @@ namespace rng
//TODO: properly implemet this f64 crand::_sample() { return (f64)std::bit_cast<u64>(_sample_raw()) / (f64)UINT64_MAX; }
// Overrides //
u64 crand::next_u64() { return std::bit_cast<u64>(_sample_raw() & INT32_MAX); } // remove sign bit because it messes with the range.
u64 crand::next_u64() { return std::bit_cast<u64>(std::abs(_sample_raw()) & INT32_MAX); } // remove sign bit because it messes with the range.
//TODO: Implementing next_i64(i64 max) should be trivial. the man page for drand48 shows its output range, just map that range to `0..=max`
//TODO: make the default range for all non-bounded `next_i/u*` the same range as drand48's. If that's too big for the integer type, scale it down.

Loading…
Cancel
Save