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.)