#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// Generate a random number not in the range [lo, hi)
int rand_outside(int lo, int hi) {
int rangesize = hi - lo;
int r
= rand() % (RAND_MAX
- rangesize
+ 1); if (r >= lo) r += rangesize;
return r;
}
int main(void) {
int third = RAND_MAX / 3;
int two_thirds = RAND_MAX - third + 1;
int nbottom = 0, ntop = 0, nmiddle = 0;
for (int i = 0; i < 10000; ++i) {
// Get a random number in the bottom third or top third of the possibilities
int r = rand_outside(third, two_thirds);
if (r < third) ++nbottom;
else if (r >= two_thirds) ++ntop;
else ++nmiddle;
}
printf("In range [%10d, %10d]: %4d\n", 0, third
- 1, nbottom
); printf("In range [%10d, %10d]: %4d\n", third
, two_thirds
- 1, nmiddle
); printf("In range [%10d, %10d]: %4d\n", two_thirds
, RAND_MAX
, ntop
); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHRpbWUuaD4KCi8vIEdlbmVyYXRlIGEgcmFuZG9tIG51bWJlciBub3QgaW4gdGhlIHJhbmdlIFtsbywgaGkpCmludCByYW5kX291dHNpZGUoaW50IGxvLCBpbnQgaGkpIHsKCWludCByYW5nZXNpemUgPSBoaSAtIGxvOwoJaW50IHIgPSByYW5kKCkgJSAoUkFORF9NQVggLSByYW5nZXNpemUgKyAxKTsKCWlmIChyID49IGxvKSByICs9IHJhbmdlc2l6ZTsKCXJldHVybiByOwp9CgppbnQgbWFpbih2b2lkKSB7CglzcmFuZCh0aW1lKE5VTEwpKTsKCWludCB0aGlyZCA9IFJBTkRfTUFYIC8gMzsKCWludCB0d29fdGhpcmRzID0gUkFORF9NQVggLSB0aGlyZCArIDE7CglpbnQgbmJvdHRvbSA9IDAsIG50b3AgPSAwLCBubWlkZGxlID0gMDsKCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7ICsraSkgewoJCS8vIEdldCBhIHJhbmRvbSBudW1iZXIgaW4gdGhlIGJvdHRvbSB0aGlyZCBvciB0b3AgdGhpcmQgb2YgdGhlIHBvc3NpYmlsaXRpZXMKCQlpbnQgciA9IHJhbmRfb3V0c2lkZSh0aGlyZCwgdHdvX3RoaXJkcyk7CgkJaWYgKHIgPCB0aGlyZCkgKytuYm90dG9tOwoJCWVsc2UgaWYgKHIgPj0gdHdvX3RoaXJkcykgKytudG9wOwoJCWVsc2UgKytubWlkZGxlOwoJfQoJcHJpbnRmKCJJbiByYW5nZSBbJTEwZCwgJTEwZF06ICU0ZFxuIiwgMCwgdGhpcmQgLSAxLCBuYm90dG9tKTsKCXByaW50ZigiSW4gcmFuZ2UgWyUxMGQsICUxMGRdOiAlNGRcbiIsIHRoaXJkLCB0d29fdGhpcmRzIC0gMSwgbm1pZGRsZSk7CglwcmludGYoIkluIHJhbmdlIFslMTBkLCAlMTBkXTogJTRkXG4iLCB0d29fdGhpcmRzLCBSQU5EX01BWCwgbnRvcCk7CglyZXR1cm4gMDsKfQo=