How to generate a random int in C?
Categories:
Generating Random Integers in C: A Comprehensive Guide

Learn how to generate pseudo-random integers in C using rand()
, srand()
, and proper modulo arithmetic for various ranges. Understand the pitfalls and best practices.
Generating random numbers is a common requirement in many programming tasks, from simulations and games to cryptography. In C, the standard library provides functions to generate pseudo-random numbers. This article will guide you through the process of generating random integers, explaining the core functions, common pitfalls, and best practices to ensure your random numbers are as unpredictable as possible for non-cryptographic uses.
Understanding rand()
and srand()
The C standard library provides two primary functions for pseudo-random number generation: rand()
and srand()
.
rand()
: This function returns a pseudo-random integer between 0 andRAND_MAX
(inclusive).RAND_MAX
is a macro defined in<stdlib.h>
, typically at least 32767.srand()
: This function seeds the pseudo-random number generator. Ifsrand()
is not called,rand()
behaves as ifsrand(1)
was called, meaning it will produce the same sequence of numbers every time the program runs. To get a different sequence each time, you need to seed it with a varying value, commonly the current time.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
// Seed the random number generator once
srand(time(NULL));
// Generate and print 5 random numbers
printf("5 random numbers:\n");
for (int i = 0; i < 5; i++) {
printf("%d\n", rand());
}
return 0;
}
Basic usage of srand()
and rand()
srand()
only once at the beginning of your program. Calling it multiple times, especially in quick succession, can lead to similar or identical sequences of random numbers if the seed (e.g., time(NULL)
) doesn't change.Generating Random Numbers Within a Specific Range
Often, you need random numbers within a specific range, not just between 0 and RAND_MAX
. The most common way to achieve this is using the modulo operator (%
).
To generate a random integer R
such that min <= R <= max
, you can use the formula:
R = (rand() % (max - min + 1)) + min;
Let's break this down:
(max - min + 1)
: This calculates the size of your desired range.rand() % (max - min + 1)
: This operation scales therand()
output to be between 0 and(max - min)
. For example, if you want numbers from 1 to 10,max - min + 1
is 10.rand() % 10
will give you numbers from 0 to 9.+ min
: Finally, addingmin
shifts this range to start from your desired minimum value. So,(0 to 9) + 1
becomes1 to 10
.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// Function to generate a random number within a specified range
int generateRandomInt(int min, int max) {
return (rand() % (max - min + 1)) + min;
}
int main() {
srand(time(NULL)); // Seed once
int lower_bound = 1;
int upper_bound = 100;
printf("5 random numbers between %d and %d:\n", lower_bound, upper_bound);
for (int i = 0; i < 5; i++) {
printf("%d\n", generateRandomInt(lower_bound, upper_bound));
}
int dice_roll_min = 1;
int dice_roll_max = 6;
printf("\n3 dice rolls:\n");
for (int i = 0; i < 3; i++) {
printf("%d\n", generateRandomInt(dice_roll_min, dice_roll_max));
}
return 0;
}
Generating random integers within a specific range
RAND_MAX
is not a multiple of the range size. For most common uses and smaller ranges, this bias is negligible. For high-quality randomness (e.g., cryptographic applications), rand()
is generally insufficient, and more robust methods are required.The Random Number Generation Process
The process of generating pseudo-random numbers in C involves seeding the generator and then repeatedly calling the rand()
function. The seed determines the starting point of the sequence, and without a changing seed, the sequence will always be the same. This diagram illustrates the typical workflow.
flowchart TD A[Start Program] --> B{Call srand(time(NULL))}; B --> C[Initialize RNG with current time]; C --> D{Need Random Number?}; D -- Yes --> E[Call rand()]; E --> F[Apply Modulo and Offset for Range]; F --> G[Use Random Number]; G --> D; D -- No --> H[End Program];
Flowchart of pseudo-random number generation in C
Alternative for Better Distribution (Less Bias)
While the modulo operator is simple, it can introduce a slight bias, especially when RAND_MAX
is not perfectly divisible by the range size. A more robust (though slightly more complex) method to reduce bias is to discard numbers that would cause bias and retry. This is often done by generating numbers until one falls within a 'safe' range that is a multiple of your desired range size.
For example, to generate a number in [min, max]
, you can calculate range = max - min + 1
. Then, generate a random number r
in [0, RAND_MAX]
and check if r < RAND_MAX - (RAND_MAX % range)
. If it is, r % range + min
is used. Otherwise, you discard r
and try again. This ensures a more uniform distribution.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// Function to generate a random number within a specified range with reduced bias
int generateRandomIntBiasReduced(int min, int max) {
int range = max - min + 1;
int rand_val;
int limit = RAND_MAX - (RAND_MAX % range);
do {
rand_val = rand();
} while (rand_val >= limit);
return (rand_val % range) + min;
}
int main() {
srand(time(NULL)); // Seed once
int lower_bound = 1;
int upper_bound = 100;
printf("5 random numbers (bias-reduced) between %d and %d:\n", lower_bound, upper_bound);
for (int i = 0; i < 5; i++) {
printf("%d\n", generateRandomIntBiasReduced(lower_bound, upper_bound));
}
return 0;
}
Generating random integers with reduced bias
/dev/urandom
on Unix-like systems or CryptGenRandom
on Windows.