为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
狐的传说 2019-08-13 10:53:25
生成范围内的唯一随机数 - PHP我需要在一个范围内生成随机的UNIQUE数字吗?怎么做 ?我可以生成随机数generator:$arr=array();$x=rand($min,$max);$len=count($arr);$flag = 0;for($i=0;$i<$len;$i++){  if ($flag == 1)    goto generator;  if ($x == $arr[$i])    $flag = 1;}$arr[$index] = $x;$index++; goto generator;我知道这段代码很糟糕,所以我需要一个更好的我的版本优化代码!救命 !例如:如果我需要在1到15之间生成3个数字,它们应该是5,9,1但不是3,1,2 [在1-3中(我想要生成的数字)]
查看完整描述

3 回答

?
Helenr

TA贡献1780条经验 获得超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);

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


# 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内存上限的风险。混合物评估范围和计数之间的比率,并有条件地选择发电机将是两个世界中最好的。


查看完整回答
反对 回复 2019-08-13
  • 3 回答
  • 0 关注
  • 733 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信