/* * This stock answer explains how to generate random numbers. * To see how it really works, you can save this answer to a * file. If you are using the olc_answers program, hit "s" * and enter a filename. If you are using Mosaic, choose * "Save As" from the file menu, and save to a text file. * Then compile that file using the command: * * cc filename.c * * and try running it by typing * * ./a.out * * You might also find more information on alternative ways * of getting random numbers by looking at * * a. chapter 7 of the Numerical Recipes book * b. the NAG library manual. * * Both books are available in our office, 11-115. * */ main() { double a_number; /* * The simplest way to get a random number is just to call * the function 'random()'. It returns a random number * between 1 and 2**31 - 1. For example: */ a_number = (float) random(); printf("A big random number is %lf.\n", a_number); /* * To get a random number between 0 and 1, you would use * this: * * double number; * number = (float) random() / (float) 0x7fffffff; * * Note that the constant 0x7fffffff is equal to * (2**31)-1, which is the maximum value of the random * number generator. */ a_number = (float) random() / (float) 0x7fffffff; printf("A random number between 0 and 1 is %lf,\n", a_number); /* * However, when used as above, the program will get * the same random numbers every time it is run. Sometimes * this is good, sometimes not. For example, in Monte Carlo * simulations a set of identical "random" numbers is useful * for debugging, but bad for getting real data. * * To change the set of numbers generated, use 'srandom' to * set an initial state. The number that you use to set this * state is called a "seed". Note that identical seeds will * generate identical sequences of random numbers. A * possible seed is the number of seconds since Jan 1, 1970, * GMT, the value given by time or the process id (from * 'getpid'). Both are used here. This 'srandom' call only * needs to be done once per program. */ srandom(time(0) * getpid()); /* * Now get and print a "real" random number. */ a_number = (float) random() / (float) 0x7fffffff; printf("But a more random number between 0 and 1 is %lf\n", a_number); /* * So, if you wanted a random number between 0 and 10, you * would take the number you got above and multiply it by 10, * and round to the nearest integer (or whatever). */ a_number = 10.0 * (float) random() / (float) 0x7fffffff; printf("But a more random number between 0 and 10 is %lf\n", a_number); }