# Faster Random Numbers with PHP

Random numbers functions `rand()`

and `mt_rand`

are easy to use and pretty fast. Numbers produced by these functions range from `0`

to `PHP_INT_MAX`

unless you specify your own range. In case you use a custom range, it generates a random number within that range, but – it gets slower.

1 |
rand( $min , $max ); //slower |

I have bench-marked the time taken by ten thousand calls to `rand()`

with and without specifying a range. The results show that `rand($min,$max)`

takes about 58% extra time compared to `rand()`

.

1 2 3 4 |
//10,000 iterations of rand( ); //Time taken: 0.0028 Seconds rand( $min , $max ); //Time taken: 0.0062 Seconds |

Without any range specified, `rand`

went significantly faster. Here are ways to achieve better, although not equal, speed of random number generation if the minimum end of your range is `0`

and the maximum value is anything less than or equal to `PHP_INT_MAX`

.

1 2 3 |
$max = 500; //Inclusive $number = mt_rand( ) % ( $max + 1 ); //Time taken: 0.0038 Sec (10,000 iterations) echo $number; //$number is now a random integer between 0 and 500. |

Alternatively, if your desired range has minimum value `0`

and the maximum value lesser than `PHP_INT_MAX`

, and your maximum value can be expressed as `2^n - 1`

where `n`

is a whole number representing the number of bits the resulting integer would take, an even better alternative is:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//2^0 -1 = 0 00000000 //2^1 -1 = 1 00000001 //2^2 -1 = 3 00000011 //2^3 -1 = 7 00000111 //2^4 -1 = 15 00001111 //2^5 -1 = 31 00011111 //2^6 -1 = 63 00111111 //. //. //. //2^31 -1 = 2147483647 //2^32 -1 = -1 Unfortunately you Cannot use it - see notes. $max = 255; //Inclusive $rand = mt_rand( ) & $max; |

So, why `-1`

does not work as `$max`

in this solution?

The answer is that `-1`

(despite being a `2^n - 1`

integer) cannot be used as `$max`

in our second alternative solution because `rand()`

generates random positive integers that are always 31 bits (on 32bit platforms) or 63 bits (on 64bit platforms). So, `&`

will never let the resultant random integer have its most significant bit (or sign bit) `ON`

and the random number will always remain positive as with `2^31 - 1`

.

To bypass the limit of `PHP_INT_MAX`

or to generate larger random numbers that fit `UNSIGNED INT`

and `BIGINT`

MySQL data types, read my post that explains how to generate large random numbers.

This was the toughest way to work with random numbers in languages like php ðŸ™‚ but it is always good to learn.