#include #include // A variable used to initialize the generator (should never be 0). long r_seed = 12345678L; // A function that returns a random number between 0 and 1. double uniform () { // Constants needed for random generation, not needed anywhere else. const static long m = 2147483647L; const static long a = 48271L; const static long q = 44488L; const static long r = 3399L; long t, lo, hi; double u; hi = r_seed / q; lo = r_seed - q * hi; t = a * lo - r * hi; if (t > 0) r_seed = t; else r_seed = t + m; u = (double) r_seed / (double) m ; return u; } void setSeed (long newSeed) { r_seed = newSeed; } double uniform_range (double a, double b) { if (b > a) { return ( a + (b-a) * uniform() ); } else if (b == a) { return a; } else { printf ("ERROR: in uniform.uniform_range(): a=%lf b=%lf\n", a, b); return 0; } } int discrete_uniform (int a, int b) { if (b > a) { double x = uniform (); int c = ( a + (int) floor ((b-a+1)*x) ); return c; } else if (a == b) { return a; } else { printf("ERROR in uniform.discrete_uniform(): a=%2ld b=%2ld\n", a, b); return 0; } } int main () { int i; double u; int d; setSeed (1); printf ("Ten random numbers between 10 and 20:\n"); for (i=0; i < 10; i++) { u = uniform_range (10, 20); printf (" %lf\n", u); } printf ("Ten random integers between 10 and 20:\n"); for (i=0; i < 10; i++) { d = discrete_uniform (10, 20); printf (" %d\n", d); } }