3 回答

TA貢獻1780條經(jīng)驗 獲得超4個贊
$len = 10; // total number of numbers
$min = 100; // minimum
$max = 999; // maximum
$range = []; // initialize array
foreach (range(0, $len - 1) as $i) {
while(in_array($num = mt_rand($min, $max), $range));
$range[] = $num;
}
print_r($range);
我很想知道接受的答案是如何與我的一致的。值得注意的是,兩者的混合可能是有利的; 實際上是一個根據(jù)特定值有條件地使用一個或另一個的函數(shù):
# The accepted answer
function randRange1($min, $max, $count)
{
$numbers = range($min, $max);
shuffle($numbers);
return array_slice($numbers, 0, $count);
}
# My answer
function randRange2($min, $max, $count)
{
$range = array();
while ($i++ < $count) {
while(in_array($num = mt_rand($min, $max), $range));
$range[] = $num;
}
return $range;
}
echo 'randRange1: small range, high count' . PHP_EOL;
$time = microtime(true);
randRange1(0, 9999, 5000);
echo (microtime(true) - $time) . PHP_EOL . PHP_EOL;
echo 'randRange2: small range, high count' . PHP_EOL;
$time = microtime(true);
randRange2(0, 9999, 5000);
echo (microtime(true) - $time) . PHP_EOL . PHP_EOL;
echo 'randRange1: high range, small count' . PHP_EOL;
$time = microtime(true);
randRange1(0, 999999, 6);
echo (microtime(true) - $time) . PHP_EOL . PHP_EOL;
echo 'randRange2: high range, small count' . PHP_EOL;
$time = microtime(true);
randRange2(0, 999999, 6);
echo (microtime(true) - $time) . PHP_EOL . PHP_EOL;
結果:
randRange1: small range, high count
0.019910097122192
randRange2: small range, high count
1.5043621063232
randRange1: high range, small count
2.4722430706024
randRange2: high range, small count
0.0001051425933837
如果您使用較小的范圍和較高的返回值計數(shù),則接受的答案肯定是最佳的; 然而正如我所預料的那樣,更大的范圍和更小的計數(shù)將在接受的答案中花費更長的時間,因為它必須存儲范圍內的每個可能的值。你甚至冒著吹PHP內存上限的風險?;旌衔镌u估范圍和計數(shù)之間的比率,并有條件地選擇發(fā)電機將是兩個世界中最好的。
- 3 回答
- 0 關注
- 755 瀏覽
添加回答
舉報