How to Generate Random Numbers in C Programming

By Dan Gookin

One mathematical function in C programming that’s relatively easy to grasp is the rand() function. It generates random numbers. Though that may seem silly, it’s the basis for just about every computer game ever invented. Random numbers are a big deal in programming.

A computer cannot generate truly random numbers. Instead, it produces what are known as pseudorandom numbers. That’s because conditions inside the computer can be replicated. Therefore, serious mathematicians scoff that any value a computer calls random isn’t a truly random number. Can you hear them scoffing?

How to generate random numbers

The rand() function is the simplest of C’s random-number functions. It requires the stdlib.h header file, and it coughs up an int value that’s supposedly random. Now, That’s Random demonstrates sample code.

NOW, THAT’S RANDOM

#include <stdio.h>
#include <stdlib.h>
int main()
{
int r,a,b;
 puts("100 Random Numbers");
 for(a=0;a<20;a++)
 {
 for(b=0;b<5;b++)
 {
 r=rand();
 printf("%dt",r);
 }
 putchar('n');
 }
 return(0);
}

Now, That’s Random uses a nested for loop to display 100 random values. The rand() function in Line 13 generates the values. The printf() function in Line 14 displays the values by using the %d conversion character, which displays int values.

Exercise 1: Create a new project by using the source code shown in Now, That’s Random. Build and run to behold 100 random values.

Exercise 2: Modify the code so that all the values displayed are in the range 0 through 20.

Here’s a hint for Now, That’s Random: Use the modulus assignment operator to limit the range of the random numbers. The format looks like this:

r%=n;

r is the number returned from the rand() function. %= is the modulus assignment operator. n is the range limit, plus 1. After the preceding statement, values returned are in the range 0 through n-1. So if you want to generate values between 1 and 100, you would use this formula:

value = (r % 100) + 1;

How to increase the randomness of numbersin C programming

Just to give some credit to the snooty mathematicians who claim that computers generate pseudo-random numbers, run the program you generated from Exercise 2. Observe the output. Run the program again. See anything familiar?

The rand() function is good at generating a slew of random values, but they’re predictable values. To make the output less predictable, you need to seed the random-number generator. That’s done by using the srand() function.

Like the rand() function, the srand() function requires the stdlib.h header, shown at Line 2 in Even More Randomness. The function requires an unsigned int value, seed, which is declared at Line 6. The scanf() function at Line 10 reads in the unsigned value by using the %u placeholder. Then the srand() function uses the seed value in Line 11.

EVEN MORE RANDOMNESS

#include <stdio.h>
#include <stdlib.h>
int main()
{
 unsigned seed;
 int r,a,b;
 printf("Input a random number seed: ");
 scanf("%u",&seed);
 srand(seed);
 for(a=0;a<20;a++)
 {
 for(b=0;b<5;b++)
 {
 r=rand();
 printf("%dt",r);
 }
 putchar('n');
 }
 return(0);
}

The rand() function is used at Line 16, although the results are now based on the seed, which is set when the program runs.

Exercise 3: Create a new project using the source code shown in Even More Randomness. Build it. Run the program a few times, trying different seed values. The output is different every time.

Alas, the random values that are generated are still predictable when you type the same seed number. In fact, when the value 1 is used as the seed, you see the same “random” values you saw in Exercise 1, when you didn’t even use srand()!

There has to be a better way.

The best way to write a random-number generator is not to ask the user to type a seed, but rather to fetch a seed from elsewhere. In More Truly Random Than Ever, the seed value is pulled from the system clock by using the time() function.

MORE TRULY RANDOM THAN EVER

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
 int r,a,b;
 srand((unsigned)time(NULL));
 for(a=0;a<20;a++)
 {
 for(b=0;b<5;b++)
 {
 r=rand();
 printf("%dt",r);
 }
 putchar('n');
 }
 return(0);
}

The time() function returns information about the current time of day, a value that’s constantly changing. The NULL argument helps solve some problems, but time() returns an ever-changing value.

The (unsigned) part of the statement ensures that the value returned by the time() function is an unsigned integer. That’s a technique known as typecasting.

The bottom line is that the srand() function is passed a seed value, courtesy of the time() function, and the result is that the rand() function generates values that are more random than you’d get otherwise.

Exercise 4: Type the source code from More Truly Random Than Ever and build the project. Run it a few times to ensure that the numbers are as random as the computer can get them.