生成不重复的随机数

18

我正在建设一个网站,每次刷新页面时将随机显示一个yelp列表。 Yelp搜索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/>";

?>

最简单的方法是预先填充一个经过消毒的随机值列表。为什么不提前创建订单,选择尚未显示的最后一个订单呢?对于普通用户来说,这看起来就像是随机的。 - Brian Hoover
你如何保留所有20个以展示它们?你是将这些列表存储在本地,还是API会在请求时发送相同的列表? - Sheriff_McLawDog
请查询“Fisher Yates”,或查看http://stackoverflow.com/questions/8116872/generate-random-numbers-in-array/8116947#8116947。 - paxdiablo
@Sheriff_McLawDog,目前我没有存储任何列表。API会发送一个名为$businesses的数组,其中包含20个列表。我想每次刷新时只显示一个列表。 - ryank
3个回答

41
最简单的解决方案:
$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

Codepad:http://codepad.org/cBaGHxFU

更新:

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

  1. 使用给定的方法生成一个随机的列表ID,然后将其存储到数据库表中。
  2. 在每次页面刷新时,生成一个随机的列表ID,并检查它是否与您的数据库中的值匹配。如果不匹配,则显示该列表并将该值添加到您的表中。
  3. 返回第1步。

完成这些步骤后,您将一次性显示所有20个列表。

希望这可以帮助!


1
抱歉,我应该包含代码以更好地解释。请查看我的编辑。 - ryank

2

试试这个代码

$a = range(1,36);

shuffle($a);

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

print_r($array);

-2
我会尝试使用 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>";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接