php 唯一随机数,生成范围内的唯一随机数 - PHP

$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);

我很想知道接受的答案是如何与我的一致的。值得注意的是,两者的混合可能是有利的; 实际上是一个根据特定值有条件地使用一个或另一个的函数:

# 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

如果您使用较小的范围和较高的返回值计数,则接受的答案肯定是最佳的; 然而正如我所预料的那样,更大的范围和更小的计数将在接受的答案中花费更长的时间,因为它必须存储范围内的每个可能的值。你甚至冒着吹PHP内存上限的风险。混合物评估范围和计数之间的比率,并有条件地选择发电机将是两个世界中最好的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值