Во-первых, у меня есть сомнения относительно решения, которое вы публикуете для 30-битного целого числа.RAND_MAX
само по себе может быть 31-битным значением, а RAND_MAX *
rand() + rand()
может переполниться, вызывая неопределенное поведение (и на практике отрицательные значения).
Если вам нужно значение, превышающее гарантированный минимум RAND_MAX
, или, если на то пошло, все, что не намного меньше RAND_MAX
, единственным решением будет использование последовательных вызовов к rand()
и объединение значений, но вам нужно сделать это осторожно и проверить правильностьРезультаты.(В большинстве реализаций rand()
используются линейные конгруэнтные генераторы, которые хотя и подходят для некоторых задач, но не особенно хороши в этом случае.) В любом случае, что-то вроде:
unsigned
rand256()
{
static unsigned const limit = RAND_MAX - RAND_MAX % 256;
unsigned result = rand();
while ( result >= limit ) {
result = rand();
}
return result % 256;
}
unsigned long long
rand64bits()
{
unsigned long long results = 0ULL;
for ( int count = 8; count > 0; -- count ) {
results = 256U * results + rand256();
}
return results;
}
(код в rand256
предназначен для устранения неизбежного смещения, которое возникает при сопоставлении значений RAND_MAX
с 256 значениями.)