The Doom Pseudorandom number generator is simplistic yet adequate for gameplay. Its simplicity has the virtue of speed.
The file m_random.c in the Doom source code contains a static table 256 bytes long containing the numbers from 0 to 255 in a fixed, scrambled order. There is an index to this table which starts at zero. Each call to the function M_Random() advances the index by one (wrapping around to zero after 255) and returns the table entry at that index.
There is another function, P_Random() that is identical except that it uses its own independent index. P_Random is used in play simulation situations, such as calculating hit damage. M_Random is used everywhere else. The reason for the existence of two individual indexes is to maintain demo and multiplayer synchronisation: for example, M_Random is used to apply a random pitch variation to sounds. As two players may not hear the same sound effect (they may be in different parts of the level), using a single index would cause the game to become desyncronised. To use an MVC (Model-View-Controller) analogy, P_Random is used for random number generation at the 'model', while M_Random is used for random number generation at the 'view'.
The function M_ClearRandom() resets both function's indexes to zero. It is called during initialization of each new level, primarily so that a demo will be the same each time it is played.
- See also: Wikipedia:Pseudorandom number generator