wp_rand()WP 2.6.2

Generates a random number between the specified min and max.

Pluggable function — this function can be replaced from a plugin. It means that this function is defined (works) only after all plugins are loaded (included), but before this moment this function has not defined. Therefore, you cannot call this and all functions depended on this function directly from a plugin code. They need to be called on plugins_loaded hook or later, for example on init hook.

Function replacement (override) — in must-use or regular plugin you can create a function with the same name, then it will replace this function.

1 time — 0.000032 sec (very fast) | 50000 times — 0.09 sec (speed of light) | PHP 7.0.8, WP 4.6.1

No Hooks.

Return

Int. A random non-negative number between min and max.

Usage

wp_rand( $min, $max );
$min(int)
Lower limit for the generated number. Accepts positive integers or zero.
$max(int)
Upper limit for the generated number. Accepts positive integers.
Default: 4294967295

Examples

0

#1 Basic usage

echo wp_rand( 99, 99999 ); // 19899, 85724, 77130, 51575
echo wp_rand( 1.5, 5.5 );  // 5, 1, 3, 4
echo wp_rand( 5, 4 );      // always 5
echo wp_rand( 0, 0 );      // 0

Notes

  • Global. String. $rnd_value

Changelog

Since 2.6.2 Introduced.
Since 4.4.0 Uses PHP7 random_int() or the random_compat library if available.
Since 6.1.0 Returns zero instead of a random number if both $min and $max are zero.

wp_rand() code WP 6.4.3

function wp_rand( $min = null, $max = null ) {
	global $rnd_value;

	/*
	 * Some misconfigured 32-bit environments (Entropy PHP, for example)
	 * truncate integers larger than PHP_INT_MAX to PHP_INT_MAX rather than overflowing them to floats.
	 */
	$max_random_number = 3000000000 === 2147483647 ? (float) '4294967295' : 4294967295; // 4294967295 = 0xffffffff

	if ( null === $min ) {
		$min = 0;
	}

	if ( null === $max ) {
		$max = $max_random_number;
	}

	// We only handle ints, floats are truncated to their integer value.
	$min = (int) $min;
	$max = (int) $max;

	// Use PHP's CSPRNG, or a compatible method.
	static $use_random_int_functionality = true;
	if ( $use_random_int_functionality ) {
		try {
			// wp_rand() can accept arguments in either order, PHP cannot.
			$_max = max( $min, $max );
			$_min = min( $min, $max );
			$val  = random_int( $_min, $_max );
			if ( false !== $val ) {
				return absint( $val );
			} else {
				$use_random_int_functionality = false;
			}
		} catch ( Error $e ) {
			$use_random_int_functionality = false;
		} catch ( Exception $e ) {
			$use_random_int_functionality = false;
		}
	}

	/*
	 * Reset $rnd_value after 14 uses.
	 * 32 (md5) + 40 (sha1) + 40 (sha1) / 8 = 14 random numbers from $rnd_value.
	 */
	if ( strlen( $rnd_value ) < 8 ) {
		if ( defined( 'WP_SETUP_CONFIG' ) ) {
			static $seed = '';
		} else {
			$seed = get_transient( 'random_seed' );
		}
		$rnd_value  = md5( uniqid( microtime() . mt_rand(), true ) . $seed );
		$rnd_value .= sha1( $rnd_value );
		$rnd_value .= sha1( $rnd_value . $seed );
		$seed       = md5( $seed . $rnd_value );
		if ( ! defined( 'WP_SETUP_CONFIG' ) && ! defined( 'WP_INSTALLING' ) ) {
			set_transient( 'random_seed', $seed );
		}
	}

	// Take the first 8 digits for our value.
	$value = substr( $rnd_value, 0, 8 );

	// Strip the first eight, leaving the remainder for the next call to wp_rand().
	$rnd_value = substr( $rnd_value, 8 );

	$value = abs( hexdec( $value ) );

	// Reduce the value to be within the min - max range.
	$value = $min + ( $max - $min + 1 ) * $value / ( $max_random_number + 1 );

	return abs( (int) $value );
}