你似乎误解了随机性的本质.小数字将来自该分布,而不是经常.如果你的模数是1e6,那么你应该会在每500次调用中看到一个低于2000的数字.
int main(void) {
int n=0, r;
do { r = rand()%1000000; ++n; } while(r>2000);
printf("it took %d calls\n", n);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
果然:
$ ./t
it took 462 calls
Run Code Online (Sandbox Code Playgroud)
现在,rand方便,但它不是一个很好的熵源; 生成器通常只是线性同余(即随机性不是很好并且周期短).你会从Mersenne Twister中获得更好的随机性.在任何一种情况下,您都需要仔细考虑如何播种发生器 - 系统提供的熵源,例如/dev/urandom通常最好的.