# Combined linear congruential generator

A combined linear congruential generator (CLCG) is a pseudo-random number generator algorithm based on combining two or more linear congruential generators (LCG). A traditional LCG has a period which is inadequate for complex system simulation. By combining two or more LCGs, random numbers with a longer period and better statistical properties can be created. The algorithm is defined as: $X_{i}\equiv \left(\sum _{j=1}^{k}(-1)^{j-1}Y_{i,j}\right){\pmod {m_{1}-1}}$ where:
* $m_{1}$ is the "modulus" of the first LCG
* $Y_{i,j}$ is the ith input from the jth LCG
* $X_{i}$ is the ith generated random integer
with: $R_{i}\equiv {\begin{cases}X_{i}/m_{1}&{\text{for }}X_{i}>0\\(m_{1}-1)/m_{1}&{\text{for }}X_{i}=0\end{cases}}$ where $R_{i}$ is a uniformly distributed random number between 0 and 1.

## Derivation

If W$_{i,1}$, W$_{i,2}$, ..., W$_{i,k}$ are any independent, discrete, random-variables and one of them is uniformly distributed from 0 to m$_1$ − 2, then Z$_i$ is uniformly distributed between 0 and m$_1$ − 2, where: $Z_{i}=\left(\sum _{j=1}^{k}W_{i,j}\right){\pmod {m_{1}-1}}$
Let X$_{i,1}$, X$_{i,2}$, ..., X$_{i,k}$ be outputs from k LCGs. If W$_{i,j}$ is defined as X$_{i,j}$ − 1, then W$_{i,j}$ will be approximately uniformly distributed from 0 to m$_j$ − 1. The coefficient "(−1)$^{j−1}$" implicitly performs the subtraction of one from X$_{i,j}$.

## Properties

The CLCG provides an efficient way to calculate pseudo-random numbers. The LCG algorithm is computationally inexpensive to use. The results of multiple LCG algorithms are combined through the CLCG algorithm to create pseudo-random numbers with a longer period than is achievable with the LCG method by itself.
The period of a CLCG is the least common multiple of the periods of the individual generators, which are one less than the moduli. Since all the moduli are odd primes, the periods are even and thus share at least a common divisor of 2, but if the moduli are chosen so that 2 is the greatest common divisor of each pair, this will result in a period of: $P={\frac {(m_{1}-1)(m_{2}-1)\cdots (m_{k}-1)}{2^{k-1}}}$

## Example

The following is an example algorithm designed for use in 32-bit computers: $k=2$ LCGs are used with the following properties: ${\begin{aligned}a_{1}&=40014&a_{2}&=40692\\m_{1}&=2147483563&m_{2}&=2147483399\\c_{1}&=0&c_{2}&=0\end{aligned}}$
The CLCG algorithm is set up as follows:
* The seed for the first LCG, $Y_{0,1}$, should be selected in the range of [1, 2147483562]. The seed for the second LCG, $Y_{0,2}$, should be selected in the range of [1, 2147483398]. Set: $i=0$
* The two LCGs are evaluated as follows: $Y_{i+1,1}=40014\times Y_{i,1}{\pmod {2147483563}}$ $Y_{i+1,2}=40692\times Y_{i,2}{\pmod {2147483399}}$
* The CLCG equation is solved as shown below: $X_{i+1}=(Y_{i+1,1}-Y_{i+1,2}){\pmod {2147483563}}$
* Calculate the random number: $R_{i+1}={\begin{cases}X_{i+1}/2147483563&{\text{for }}X_{i+1}>0\\(X_{i+1}/2147483563)+1&{\text{for }}X_{i+1}<0\\2147483562/2147483563&{\text{for }}X_{i+1}=0\end{cases}}$
* Increment the counter (i := i + 1) then return to step 2 and repeat.
The maximum period of the two LCGs used is calculated using the formula: $(m-1)$ This equates to 2.1×10$^9$ for the two LCGs used.
This CLCG shown in this example has a maximum period of: $(m_{1}-1)(m_{2}-1)/2\approx 2.3\times 10^{18}$ This represents a tremendous improvement over the period of the individual LCGs. It can be seen that the combined method increases the period by 9 orders of magnitude.
Surprisingly the period of this CLCG may not be sufficient for all applications. Other algorithms using the CLCG method have been used to create pseudo-random number generators with periods as long as 3×10$^{57}$.
The former of the two generators, using b = 40,014 and m = 2,147,483,563, is also used by the Texas Instruments TI-30X IIS scientific calculator.