// Copyright 2023 Alejandro Colomar // SPDX-License-Identifier: LGPL-3.0-or-later WITH LGPL-3.0-linking-exception #ifndef INCLUDE_C_RAND_CSRAND_CSRAND_UNIFORM_H_ #define INCLUDE_C_RAND_CSRAND_CSRAND_UNIFORM_H_ #include #include #include #pragma clang assume_nonnull begin inline uint64_t c_csrand64_uniform(uint64_t n); inline uint64_t c_csrand64_interval(uint64_t min, uint64_t max); inline uint64_t c_csrand64_uniform(uint64_t n) { uint64_t r, max, mask; max = n - 1; mask = c_bit_ceil_wrap_64(n) - 1; do { r = c_csrand64(); r &= mask; } while (r > max); return r; } inline uint64_t c_csrand64_interval(uint64_t min, uint64_t max) { return c_csrand64_uniform(max - min + 1) + min; } #pragma clang assume_nonnull end #endif // Header guard