php生成不重复随机数、数组的4种方法分享

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php生成不重复随机数、数组的4种方法分享相关的知识,希望对你有一定的参考价值。

参考技术A 下面写几种生成不重复随机数的方法,直接上代码吧
复制代码
代码如下:
<?php
define('RANDOM_MAX',
100);
define('COUNT',
10);
echo
'max
random
num:
'.RANDOM_MAX,
'
;result
count:'.COUNT,
'<br/>';
invoke_entry('rand1');
invoke_entry('rand2');
invoke_entry('rand3');
invoke_entry('rand4');
function
invoke_entry($func_name)

$time
=
new
time();
$time->time_start();
call_user_func($func_name);
echo
$func_name.'
time
spend:
',
$time->time_spend();
echo
'<br/>';

function
rand1()

$numbers
=
range
(1,
RANDOM_MAX);
shuffle($numbers); //随机打乱数组
$result
=
array_slice($numbers,
1,
COUNT);
return
$result;

function
rand2()

$result
=
array();
while(count($result)<
COUNT)

$result[]
=
mt_rand(1,
RANDOM_MAX); //mt_rand()是比rand()更好更快的随机函数
$result
=
array_unique($result);
//删除数组中重复的元素

return
$result;

function
rand3()

$result
=
array();
while(count($result)
<
COUNT)

$_tmp
=
mt_rand(1,
RANDOM_MAX);
if(!in_array($_tmp,
$result))
//当数组中不存在相同的元素时,才允许插入
$result[]
=
$_tmp;


return
$result;

function
rand4()

$result
=
array();
while
(count($result)
<
COUNT)

$result[]
=
mt_rand(1,
RANDOM_MAX);
$result
=
array_flip(array_flip($result)); //array_flip将数组的key和value交换

return
$result;

class
time

private
$_start;

public
function
time_start()

$this->_start
=
$this->microtime_float();

public
function
time_spend()

return
$this->microtime_float()
-
$this->_start;

private
function
microtime_float()

list($usec,
$sec)
=
explode("
",
microtime());
return
((float)$usec
+
(float)$sec);


?>

生成不重复的随机数

【中文标题】生成不重复的随机数【英文标题】:Generating random numbers without repeats 【发布时间】:2013-07-20 15:58:15 【问题描述】:

我正在构建一个网站,每次刷新页面时都会随机显示一个 yelp 列表。 yelp search api 在一个数组中返回 20 个列表。现在,我正在使用 PHP 的函数 rand(0,19) 来在每次页面刷新时生成一个随机列表( $businesses[rand(0,19)] )。

有人可以向我推荐一种更智能的随机化方法吗?我想在重复任何一个之前显示所有 20 个列表一次。处理这个问题的首选方法是什么?

以下答案不起作用,因为每次刷新页面时都会重新创建数字。我猜我需要存储我已经使用过的号码?

$numbers = range(0, 19);

shuffle($numbers);

// Handle Yelp response data
$response = json_decode($data);
$RANDOM = rand(1,19);
$business = $response->businesses;

echo "<img border=0 src='".$business[$RANDOM]->image_url."'><br/>";
echo $business[$RANDOM]->name."<br/>";
echo "<img border=0 src='".$business[$RANDOM]->rating_img_url_large."'><br/>";

?>

【问题讨论】:

执行此操作的最简单方法是预先填充经过清理的随机值列表。为什么不提前创建订单,然后选择最后一个未显示的订单。对于普通用户来说,这似乎是随机的。 你如何让所有 20 人都在身边展示给他们看?您是在本地存储列表,还是 API 会根据要求向您发送相同的列表? 查找“Fisher Yates”,或查看***.com/questions/8116872/…。 @Sheriff_McLawDog 我目前没有存储任何列表。该 api 在一个名为 $businesses 的数组中发送 20 个列表。我想每次刷新一次显示一个列表 【参考方案1】:

最简单的解决方案:

$numbers = range(1, 20);
shuffle($numbers);

替代方案:

<?php

function randomGen($min, $max, $quantity) 
    $numbers = range($min, $max);
    shuffle($numbers);
    return array_slice($numbers, 0, $quantity);


print_r(randomGen(0,20,20)); //generates 20 unique random numbers

?>

类似问题:#5612656

键盘:http://codepad.org/cBaGHxFU

更新:

您将在一个名为 $businesses 的数组中获取所有列表。

    使用上面给出的方法生成一个随机列表 ID,然后将其存储到您的数据库表中。 在每次页面刷新时,生成一个随机列表 ID,并检查它是否与数据库中的值匹配。如果没有,请显示该列表并将该值添加到您的表格中。 转到步骤 1。

完成后,您将一次显示所有 20 个列表。

希望这会有所帮助!

【讨论】:

对不起,我应该包含代码以便更好地说明。请看我的编辑【参考方案2】:

试试这个代码

$a = range(1,36);

shuffle($a);

$array = array_slice($a, 0, 3);

print_r($array);

【讨论】:

【参考方案3】:

我会通过 while 循环试试这个:

<?php

  $i = 0;
  $arr = array();

  while($i<10)
    $num = rand(1, 12);
    $c = 0;
    echo $num . "<br>";

    for($j=0; $j<4; $j++)
      if($arr[$j] == $num)
        $c++;
        break;
      
    
    if($c==0)
      $arr[$i] = $num;
      $i++;
    
  

  echo "<pre>";
  print_r($arr);
  echo "</pre>";

【讨论】:

以上是关于php生成不重复随机数、数组的4种方法分享的主要内容,如果未能解决你的问题,请参考以下文章

PHP生成随机密码的4种方法及性能对比

PHP产生不重复随机数的5个方法总结

BigQuery - 在数组内部生成时重复的随机数

求PHP语言随机自动生成不重复的数字

PHP CodeBase: 生成N个不重复的随机数

生成不重复的随机数