Нужно объединить биты нескольких случайных значений сгенерированных rand, так чтобы получилось число, в котором столько значащих битов, сколько в верхней границе диапазона. А потом оставлять только значения входящие в диапазон, остальные откидывать и генерировать снова. Например:
#include <inttypes.h>
#include <stdlib.h>
static int width(uint64_t v)
{
int i;
for (i = 0; v; ++i)
v >>= 1;
return i;
}
uint64_t big_rand(uint64_t low, uint64_t high)
{
uint64_t d = high - low;
int rn;
int n;
assert(low < high);
rn = width(RAND_MAX);
n = width(d);
for (;;) {
uint64_t v = 0;
int i;
for (i = 0; i < n; i += rn) {
v |= rand() << i;
}
if (i != n) {
v &= ~(((UINT64_C(1) << (i - n)) - 1) << n);
}
if (v <= d) {
return v + low;
}
}
}