random-util: add random_u64_range() that acquires a random number from a certain range, unbiased
So far we have been quite sloppy with this and ignored modulus and range bias. Let's do something about, and add the option to do better.
This commit is contained in:
@@ -494,3 +494,22 @@ int random_write_entropy(int fd, const void *seed, size_t size, bool credit) {
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int random_u64_range(uint64_t m) {
|
||||
uint64_t x, remainder;
|
||||
|
||||
/* Generates a random number in the range 0…m-1, unbiased. (Java's algorithm) */
|
||||
|
||||
if (m == 0) /* Let's take m == 0 as special case to return an integer from the full range */
|
||||
return random_u64();
|
||||
if (m == 1)
|
||||
return 0;
|
||||
|
||||
remainder = UINT64_MAX % m;
|
||||
|
||||
do {
|
||||
x = random_u64();
|
||||
} while (x >= UINT64_MAX - remainder);
|
||||
|
||||
return x % m;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user