, RAND_MAX UINT_MAX . , UINT_MAX RAND_MAX 2^k - 1. UINT_MAX . sizeof(int)=32 , k=32, sizeof(int)=64 bit, k=64 .. RAND_MAX. , RAND_MAX 2^k - 1. ? , rand().
(.. C x(k), rand(), x(k+1))
, (a, c m) . , .. , m UINT_MAX, . , , , m , UINT_MAX. m .
, , rand() , , . mod foo % (2^k - 1), foo & (1<<k-1). k Mersenne prime.
, k=31, 2^31-1 = 2147483647. 32- , UINT_MAX=2^32-1 = 4294967295. 64- UINT_MAX=2^64-1=18446744073709551615, RAND_MAX 2^61-1 = 2305843009213693951.
, : , , . , init. ++, static_assert , , . Boost , ++ 11... .. ( is_power_of_two_minus_one ):
unsigned int myrand()
{
static_assert(sizeof(int)==4,"sizeof(unsigned int) != 4");
static_assert(is_power_of_two_minus_one(RAND_MAX),"RAND_MAX not a power of two minus one");
static_assert(is_power_of_two_minus_one(UINT_MAX),"UINT_MAX not power of two minus one");
unsigned int raw_rand=rand();
return raw_rand;
}