First, I have my doubts about the solution you post for a 30 bit
integer. RAND_MAX
itself could be a 31 bit value, and RAND_MAX *
rand() + rand()
is likely to overflow, producing undefined behavior
(and in practice, negative values).
If you need a value larger than the guaranteed minimum of RAND_MAX
, or
for that matter, anything that isn't significantly smaller than
RAND_MAX
, the only solution will be to use successive calls to
rand()
, and combine the values, but you need to do this carefully, and
validate the results. (Most implementations of rand()
use linear
congruent generators, which while adequate for some tasks, aren't
particularly good in this case.) Anyway, something like:
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;
}
(The code in rand256
is designed to eliminate the otherwise
unavoidable bias you get when mapping RAND_MAX
values to 256 values.)
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…