Changeset View
Changeset View
Standalone View
Standalone View
src/random.h
Show First 20 Lines • Show All 173 Lines • ▼ Show 20 Lines | uint64_t randbits(int bits) noexcept { | ||||
} | } | ||||
uint64_t ret = bitbuf & (~uint64_t(0) >> (64 - bits)); | uint64_t ret = bitbuf & (~uint64_t(0) >> (64 - bits)); | ||||
bitbuf >>= bits; | bitbuf >>= bits; | ||||
bitbuf_size -= bits; | bitbuf_size -= bits; | ||||
return ret; | return ret; | ||||
} | } | ||||
} | } | ||||
/** Generate a random integer in the range [0..range). */ | /** | ||||
* Generate a random integer in the range [0..range). | |||||
* Precondition: range > 0. | |||||
*/ | |||||
uint64_t randrange(uint64_t range) noexcept { | uint64_t randrange(uint64_t range) noexcept { | ||||
assert(range); | assert(range); | ||||
--range; | --range; | ||||
int bits = CountBits(range); | int bits = CountBits(range); | ||||
while (true) { | while (true) { | ||||
uint64_t ret = randbits(bits); | uint64_t ret = randbits(bits); | ||||
if (ret <= range) { | if (ret <= range) { | ||||
return ret; | return ret; | ||||
▲ Show 20 Lines • Show All 79 Lines • Show Last 20 Lines |