ちょっとした小ネタ。
一様乱数から正しくNの剰余を求める場合は
RAND_MAXからのNの剰余以下の数字は棄却しましょう。

unsigned int rand0toNminus1( unsigned int n )
{
unsigned int m, r;
if ( n == 0 ) return 0;
m = RAND_MAX % n;
do {
r = rand();
} while ( r <= m ) ;
return r % n;
}