rand() function
C programming
algorithms
random number generation
standard library

What common algorithms are used for C's rand?

Data Structures & Algorithms practice on Codemia

Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.

Practice algorithms

The `rand()` function in C is a standard library function used for generating pseudo-random numbers. While the C standard itself doesn't specify the exact algorithm that should be used by `rand()`, most implementations are based on common algorithms that approximate true randomness over a finite period. These algorithms are deterministic and can produce a sequence of numbers that mimics the properties of "randomness." Below, we explore some of the prevalent algorithms used and their characteristics.

1. Linear Congruential Generator (LCG)

One of the most common algorithms used behind the `rand()` function is the Linear Congruential Generator (LCG). It is defined by the recurrence relation:

Xn+1=(aXn+c)modmX_{n+1} = (aX_n + c) \mod m

Where: • XnX_n is the sequence of pseudo-random values. • mm is the modulus. • aa is the multiplier. • cc is the increment. • x0x_0 is the seed or start value.

This simple algorithm is favored due to its minimal computational requirements. However, its period (the sequence length over which it begins to repeat) and randomness quality highly depend on the choice of constants aa, cc, and mm.

Example of LCG:

A common choice in practice is the BSD implementation, where: • a=1103515245a = 1103515245c=12345c = 12345m=231m = 2^{31}

Using these parameters provides a period of 2312^{31}.

2. Park-Miller Generator

The Park-Miller generator, also known as a "minimal standard" generator, is a particular form of LCG where:

Xn+1=(aXn)modmX_{n+1} = (aX_n) \mod m

Typically, it might use: • a=16807a = 16807m=2311m = 2^{31} - 1

This version eliminates the need for an increment (c=0c = 0), making it simpler.

3. Mersenne Twister

Although not a typical choice for `rand()` in C implementations by default, the Mersenne Twister is a widely used algorithm in various applications due to its longer period and better randomness quality.

• Period: 21993712^{19937} - 1 • Generates numbers with a high degree of uniform distribution.

This algorithm was developed to address many of the shortcomings of LCGs, particularly their shorter periods and lack of randomness quality.

4. XOR-Shift

Another alternative is the XOR-Shift algorithm introduced by George Marsaglia. It is known for generating sequences with long periods using bitwise operations.

XOR-Shift involves a series of shifts and XOR operations on a state variable, multiplying the effectiveness of bitwise arithmetic for performance.

Example XOR-Shift generator:

Periodicity: All pseudo-random number generators have a period after which numbers repeat, though some periods are longer than others. • Quality of Randomness: Some applications, such as cryptographic operations, require stronger random number generators than those typically used for `rand()`. • Cross-platform Variability: The default implementation of `rand()` and its associated algorithm can vary across different platforms or compilers, resulting in differing sequences even with the same seed.


Related reading
Course
Intermediate
27 lessons
15 hours
DSA Fundamentals

Master algorithmic patterns and data structures through hands-on LeetCode-style problems - from arrays and hashing to dynamic programming and advanced graphs.

View the course
Track what you have practised

A free account saves your progress, solutions and study plan across every problem on Codemia.

Data Structures & Algorithms practice on Codemia

Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.

Practice algorithms

All Rights Reserved.