|
|
@ -9,7 +9,7 @@
|
|
|
|
#include "crand.h"
|
|
|
|
#include "crand.h"
|
|
|
|
|
|
|
|
|
|
|
|
namespace rng
|
|
|
|
namespace rng
|
|
|
|
{
|
|
|
|
{
|
|
|
|
void crand::_deleter::delete_object(_opaque** state) { _jr_free(reinterpret_cast<jr_state*>(*state)); *state = nullptr; }
|
|
|
|
void crand::_deleter::delete_object(_opaque** state) { _jr_free(reinterpret_cast<jr_state*>(*state)); *state = nullptr; }
|
|
|
|
|
|
|
|
|
|
|
|
crand::crand(_opaque* raw) :_state(mem::aligned_ptr<_opaque, _deleter>(raw)){}
|
|
|
|
crand::crand(_opaque* raw) :_state(mem::aligned_ptr<_opaque, _deleter>(raw)){}
|
|
|
@ -21,6 +21,10 @@ namespace rng
|
|
|
|
|
|
|
|
|
|
|
|
//TODO: properly implemet this f64 crand::_sample() { return (f64)std::bit_cast<u64>(_sample_raw()) / (f64)UINT64_MAX; }
|
|
|
|
//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()); }
|
|
|
|
|
|
|
|
//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.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void rng_test()
|
|
|
|
void rng_test()
|
|
|
|