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.
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;
+}
size_t random_pool_size(void);
int random_write_entropy(int fd, const void *seed, size_t size, bool credit);
+
+int random_u64_range(uint64_t max);