我想从给定的范围内得到10个随机数。
我使用下面的代码,但对于较大的范围,它是缓慢的。让它尽可能快的任何替代方法。
$rangearr = array_rand(range(1,11892032), 5);
$rangearr = implode(",",$rangearr);
只需使用mt_rand()
$randomnr = array();
$min = 1;
$max = 11892032;
for($i = 0; $i < 10;$i++) {
$randomnr[] = mt_rand($min, $max);
}
echo implode(', ', $randomnr);
对于唯一号码,请使用以下选项:
$randomnr = array();
$min = 1;
$max = 11892032;
$i = 1;
while($i <= 10) {
$rand = mt_rand($min, $max);
if(!in_array($rand,$randomnr)) {
$randomnr[] = $rand
$i++;
}
}
在数组中加载11892032个值需要时间,因此只需生成10个数字。
所以我把放在一起
<?php
// range
$timer = microtime(true);
$rangearr = array_rand(range(1,11892032), 5);
$rangearr = implode(",",$rangearr);
echo number_format(microtime(true) - $timer, 5) . '<br>';
// fixed range
$timer = microtime(true);
$range = range(1, 11892032);
$rangearr = array_rand($range, 5);
$rangearr = implode(",",$rangearr);
echo number_format(microtime(true) - $timer, 5) . '<br>';
// for loop
$timer = microtime(true);
$rangearr = [];
for($i = 0; $i < 5; $i++)
{
$rangarr[] = rand(1, 11892032);
}
echo number_format(microtime(true) - $timer, 5) . '<br>';
我得到这些结果
1.93242
1.18987
0.00002
我会采用for循环的方法!
如果你想要一个单行:
$min = 1;
$max=11892032;
echo implode(',', array_map(function()use($min,$max){return mt_rand($min, $max);},range(0,9)));
另一种方式
$arr = array();
$min = 1;
$max = 11892032 + 1; // important +1
for ($i = 0; $i < 10; $i++) {
$arr[] = (mt_rand() + $min) % $max;
}
睡前阅读:http://pageconfig.com/post/faster-random-numbers-with-php
您也可以尝试下面的这个片段,它比range()
快得多,并且您是否会提供一个几乎安全的整数,或者在这种情况下是一个没有小数位数的浮点值,您也可以在返回之前将其强制转换为int。
我还检查了循环中的双色带,所以如果你想要五个唯一的数字($randomNumberCount = 5;
),你就会得到它
小心:如果发生错误,请阅读代码中的注释。
工作示例:
function secure_rand( $min, $max ) {
$diff = $max - $min;
if ($diff < 0 || $diff > 0x7FFFFFFF) {
throw new RuntimeException("Bad range");
}
// if mcrypt is enabled try this
//$bytes = mcrypt_create_iv( 4, MCRYPT_DEV_URANDOM );
// if mcrypt is not enabled on your server, you can use this
$bytes = openssl_random_pseudo_bytes( 4 );
// if mbstring is not enabled, you can also use iconv_strlen
if ($bytes === false || mb_strlen($bytes, '8bit') != 4) {
throw new RuntimeException("Unable to get 4 bytes");
}
$ary = unpack("Nint", $bytes);
$val = $ary['int'] & 0x7FFFFFFF; // 32-bit safe
$fp = $val / 2147483647.0; // convert to [0,1]
// if you really need a type of int take this
// return (int) round($fp * $diff) + $min;
// otherwise it will return a float without decimal numbers
return round($fp * $diff) + $min;
}
$randomNumbers = array();
$randomNumberCount = 5;
$min = 1;
$max = 11892032;
while( count( $randomNumbers ) < $randomNumberCount ) {
$rand = secure_rand( $min, $max );
// check for doublettes
if( in_array( $rand, $randomNumbers ) ) continue;
$randomNumbers[] = $rand;
}
$randomNumbers = implode( ",", $randomNumbers );
echo $randomNumbers;