Understanding the algorithm of Visual C's rand function
Data Structures & Algorithms practice on Codemia
Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.
Introduction
Visual C's classic rand() implementation is a linear congruential generator, or LCG. That matters because the function is deterministic, has limited statistical quality, and is easy to reproduce once you know the recurrence. Understanding the algorithm is useful for debugging legacy code, reproducing old behavior, and knowing when rand() is not good enough.
The Core Recurrence
A common description of the Visual C runtime algorithm is:
The internal state is updated each time rand() is called. The returned value is not the full state. Instead, it uses high-order bits of the updated state and masks the result to a 15-bit integer.
That is why the typical RAND_MAX value in this family of implementations is 32767.
Reproducing The Behavior In C++
You can model the algorithm directly.
This kind of reimplementation is useful when you need compatibility with historical output sequences.
Why The Generator Is Predictable
LCGs are simple and fast, but they are not strong random-number generators. Given the same seed, they always produce the same sequence.
Both outputs match because reseeding restarts the same deterministic sequence.
This predictability is useful for repeatable tests, but it is weak for simulation quality and completely inappropriate for cryptographic use.
Statistical Limitations
The weaknesses of an LCG show up in several ways:
- short effective output range because only 15 bits are returned
- visible correlation in low-quality statistical scenarios
- poor behavior when developers use
rand() % ncarelessly
The modulo pattern is especially common.
This is easy to write, but the distribution can be biased when RAND_MAX + 1 is not a multiple of the target range.
When It Still Matters
You may still care about Visual C's rand() algorithm when:
- maintaining legacy code that depends on exact historical sequences
- reproducing older game or simulation logic
- debugging serialized test fixtures that assume Microsoft CRT behavior
If exact compatibility matters, replacing it with a modern generator changes program behavior even if the new generator is statistically better.
For new code, modern C++ provides better options in the <random> header.
Common Pitfalls
A common mistake is assuming rand() provides high-quality randomness just because it changes on each call. It is only pseudo-random and has well-known limitations.
Another mistake is depending on exact rand() sequences across compilers or runtimes. The standard does not guarantee one universal algorithm, so compatibility assumptions can break outside the target CRT.
Developers also often overlook the bias introduced by rand() % n. Even if the underlying generator were better, modulo reduction can still distort the distribution.
Finally, do not use this algorithm for security-sensitive tasks. Predictability is a feature for debugging, not for secrets.
Summary
- Visual C's classic
rand()uses a linear congruential generator. - A common recurrence is
state = state * 214013 + 2531011, then return high bits. - The output range is effectively 15 bits, matching
RAND_MAXaround32767. - The generator is deterministic and easy to reproduce from a seed.
- It is useful for legacy compatibility but weak for serious randomness needs.
- For new C++ code, prefer
<random>overrand().
Related reading
- Understanding the pseudocode in the Donald B. Johnson's algorithm
- Understanding the Recursion of mergesort
- Understanding Time complexity calculation for Dijkstra Algorithm
- Understanding Ukkonen's algorithm for suffix trees
- Unit Testing C Code
- Unusual Speed Difference between Python and C
- Unfamiliar symbol in algorithm what does ∀ mean?
- Union-find expressed as a social network

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 courseTrack 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.