random_int()
版本:php7
(PHP 7)
Generates cryptographically secure pseudo-random integers
说明
random_int(int $min,int $max): int
Generates cryptographic random integers that are suitable for use where unbiased results are critical, such as when shuffling a deck of cards for a poker game.
The sources of randomness used for this function are as follows:
- On Windows,»CryptGenRandom()will always be used. As of PHP 7.2.0,the» CNG-APIwill always be used instead.
- On Linux,the» getrandom(2)syscall will be used if available.
- On other platforms,/dev/urandomwill be used.
- If none of the aforementioned sources are available, then anExceptionwill be thrown.
Note:Although this function was added to PHP in PHP 7.0,a» userland implementationis available for PHP 5.2 to 5.6, inclusive.
参数
- $min
The lowest value to be returned, which must be
PHP_INT_MIN
or higher.- $max
The highest value to be returned, which must be less than or equal to
PHP_INT_MAX
.
返回值
Returns a cryptographically secure random integer in the range$minto$max, inclusive.
错误/异常
- If an appropriate source of randomness cannot be found,anExceptionwill be thrown.
- If invalid parameters are given,aTypeErrorwill be thrown.
- If$maxis less than$min,anErrorwill be thrown.
范例
Example #1random_int()example
<?php var_dump(random_int(100, 999)); var_dump(random_int(-1000, 0)); ?>
以上例程的输出类似于:
int(248) int(-898)
参见
random_bytes()
Generates cryptographically secure pseudo-random bytes
Here is a simple backporting function, it works for PHP >= 5.1 <?php if (!function_exists('random_int')) { function random_int($min, $max) { if (!function_exists('mcrypt_create_iv')) { trigger_error( 'mcrypt must be loaded for random_int to work', E_USER_WARNING ); return null; } if (!is_int($min) || !is_int($max)) { trigger_error('$min and $max must be integer values', E_USER_NOTICE); $min = (int)$min; $max = (int)$max; } if ($min > $max) { trigger_error('$max can\'t be lesser than $min', E_USER_WARNING); return null; } $range = $counter = $max - $min; $bits = 1; while ($counter >>= 1) { ++$bits; } $bytes = (int)max(ceil($bits/8), 1); $bitmask = pow(2, $bits) - 1; if ($bitmask >= PHP_INT_MAX) { $bitmask = PHP_INT_MAX; } do { $result = hexdec( bin2hex( mcrypt_create_iv($bytes, MCRYPT_DEV_URANDOM) ) ) & $bitmask; } while ($result > $range); return $result + $min; } } ?> Randomness test <?php $max = 100; // number of random values $test = 1000000; $array = array_fill(0, $max, 0); for ($i = 0; $i < $test; ++$i) { ++$array[random_int(0, $max-1)]; } function arrayFormatResult(&$item) { global $test, $max; // try to avoid this nowdays ;) $perc = ($item/($test/$max))-1; $item .= ' '. number_format($perc, 4, '.', '') .'%'; } array_walk($array, 'arrayFormatResult'); print_r($array); ?>
<?php // PHP >= 7 function str_rand(int $length = 16){ $x = ''; for($i = 1; $i <= $length; $i++){ $x .= dechex(random_int(0,255)); } return substr($x, 0, $length); } var_dump(str_rand()); ?>
This function is based on Andrew Moore's UUID generation function on the uniqid function; it has been updated to use random_int() on PHP 7.0 or later yet continue to function with earlier versions using mt_rand(). function generateUUIDv4() { if(version_compare(PHP_VERSION,'7.0.0', '<') ) { return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', // 32 bits for "time_low" mt_rand(0, 0xffff), mt_rand(0, 0xffff), // 16 bits for "time_mid" mt_rand(0, 0xffff), // 16 bits for "time_hi_and_version", // four most significant bits holds version number 4 mt_rand(0, 0x0fff) | 0x4000, // 16 bits, 8 bits for "clk_seq_hi_res", // 8 bits for "clk_seq_low", // two most significant bits holds zero and one for variant DCE1.1 mt_rand(0, 0x3fff) | 0x8000, // 48 bits for "node" mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff) ); } else { return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', // 32 bits for "time_low" random_int(0, 0xffff), random_int(0, 0xffff), // 16 bits for "time_mid" random_int(0, 0xffff), // 16 bits for "time_hi_and_version", // four most significant bits holds version number 4 random_int(0, 0x0fff) | 0x4000, // 16 bits, 8 bits for "clk_seq_hi_res", // 8 bits for "clk_seq_low", // two most significant bits holds zero and one for variant DCE1.1 random_int(0, 0x3fff) | 0x8000, // 48 bits for "node" random_int(0, 0xffff), random_int(0, 0xffff), random_int(0, 0xffff) ); } }