Node:Random numbers,
Next:Lexicon,
Previous:ELF vs COFF,
Up:Miscellany
Q: How do I produce random numbers with DJGPP?
Q: I keep getting the same random numbers each time I run my
program. How do I get a different series on every run?
Q: How do I get random numbers between 20 and 200?
A: DJGPP has in its library several functions to produce series of
pseudo-random43 numbers. One of them,
rand, is part of the ANSI C Standard, and is therefore very
portable to other environments. Other random-number functions,
random and the rand48 family of functions, are available
on almost every Unix platform, but are usually unsupported by
DOS/Windows compilers. On the other hand, series produced by
random and rand48 have better qualities than those
produced by rand. In particular, the least-significant bits in
the numbers produced by random are much more random than those
you get from rand, so if you need, say, a random number between 0
and 4, and portability is not an issue, you will get better results with
random () % 5. However, the DJGPP implementation of
rand is quite good, so when portability is important, you
should use rand.
Both rand and random return a pseudo-random integer in the
range [0..RAND_MAX), where RAND_MAX is defined in the
stdlib.h header. Within the rand48 family, some functions
return integers, either in the range [0..RAND_MAX) or in
[-RAND_MAX..RAND_MAX), while others return a double value
between 0.0 and 1.0.
By default, every time you restart a program, you get the same series of
pseudo-random numbers. This is important in some applications, because
it allows to reproduce exactly the results of running a program which
used random series, and thus makes debugging easier. But sometimes,
e.g. in a game, you will want a different series every time. To achieve
that, you need to initialize the random series with a different
seed. Every random-generating function has its own seed function
provided for this purpose: rand has srand, random
has srandom, the rand48 family can be seeded with either
srand48 or seed48. You seed the series with a single call
to the appropriate seed function, and then proceed by calling
rand, random, etc. as usual.
A popular way of getting a different seed every run is to use the current system clock as the seed, like this:
srand (time (NULL));
If the 1-second granularity of the values returned by time is not
enough for you (e.g., if you need to generate more than one series every
second), use gettimeofday or uclock, or use the values
returned by rand as an argument to srandom (or vice
versa).
To produce random integers from the inclusive interval
[low..high] (where low and high are two
integer numbers), use code like this:
#include <stdlib.h>
int random_number =
low + (double)rand () * (high - low + 1) / RAND_MAX;
This produces a more random sequence than if you use the %
operator, but for the price of producing slower code (since it involves
floating-point math).
If you want to know more about random number generation, I suggest reading the article Random Number Generators: Good Ones Are Hard To Find, by Stephen K. Park and Keith W. Miller, in CACM, v31(10), 1988, pp. 1192-1201.