/* random.c - Random number generators - Don Yang (uguu.org) 01/02/05 */ #include #include /* Random seed from OCaml's random.ml */ static unsigned int LFR_RandomSeed[55] = { 509760043, 399328820, 99941072, 112282318, 611886020, 516451399, 626288598, 337482183, 748548471, 808894867, 657927153, 386437385, 42355480, 977713532, 311548488, 13857891, 307938721, 93724463, 1041159001, 444711218, 1040610926, 233671814, 664494626, 1071756703, 188709089, 420289414, 969883075, 513442196, 275039308, 918830973, 598627151, 134083417, 823987070, 619204222, 81893604, 871834315, 398384680, 475117924, 520153386, 324637501, 38588599, 435158812, 168033706, 585877294, 328347186, 293179100, 671391820, 846150845, 283985689, 502873302, 718642511, 938465128, 962756406, 107944131, 192910970 }; static unsigned int LFR_RandomIdx = 0; /* Random number generator using linear feedback registers */ static int LFR_RandomInt(void) { LFR_RandomIdx = (LFR_RandomIdx + 1) % 55; return (int)(LFR_RandomSeed[LFR_RandomIdx] += LFR_RandomSeed[(LFR_RandomIdx + 24) % 55]) & 0x3fffffff; } /* Random seed */ static unsigned int PR_RandomSeed = 12345; /* Random number generator using power residue function */ static int PR_RandomInt(void) { PR_RandomSeed = PR_RandomSeed * 22695477 + 1; return (int)(PR_RandomSeed & 0x3fffffff); } /* Test driver */ int main(int argc, char **argv) { FILE *outfile; int i, size; if( argc < 4 ) return printf("%s \n", *argv); if( (outfile = fopen(argv[1], "wb+")) == NULL ) return printf("Can not create %s\n", argv[1]); PR_RandomSeed = (unsigned int)atoi(argv[3]); for(i = 0; i < 55; i++) LFR_RandomSeed[i] ^= PR_RandomInt(); size = atoi(argv[2]); for(i = 0; i < size; i++) (void)fputc(LFR_RandomInt() & 255, outfile); return fclose(outfile); }