/*
* 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);
}