0

我有这个 PHP for 循环。它创建一个随机数。

for($i = 0; $i < mysql_num_rows($query); $i++) {
$random = rand(000, 999);
}

我希望for永远不会重复随机的结果。运行 999次for,我希望它永远不会重复for.

4

9 回答 9

6

我不会使用for循环和跟踪数组。而是使用您的值范围创建一个数组并将其打乱。

$random_numbers = range(0, 999);
shuffle($random_numbers);

现在您可以从这个数组中弹出项目,并保证它们是唯一的。str_pad()如果您需要将输出格式化为000,001等,请使用。

于 2013-07-03T14:48:33.767 回答
3

shuffle()可能是最好的选择,但如果你出于某种原因不想这样做,这是另一种选择:

$max_value = 999;
$values = range(0, $max_value);
$counter = $max_value;
$num_rows = mysql_num_rows($query); //Best to move this out of the for loop so it doesn't recalculate every time through
for($i = 0; $i < $num_rows; $i++){
    $rand_num = rand(0,$counter);
    $current_number = $values[$rand_num];
    array_splice($values, $rand_num, 1);
    $counter--;
    echo "rand number: " . $current_number . '<br>';
}
于 2013-07-03T14:54:08.617 回答
1
$randomArray = array_rand(range(0, 999), $size = mysql_num_rows($query));

for ($i = 0; $i < $size; $i++) {
    $random = $randomArray[$i];
    // ...
}
于 2013-07-03T14:47:48.297 回答
1

有几种方法可以做到这一点。您可以在 MySQL 查询本身中执行此操作。只需使用:

SELECT ... ORDER BY RAND()

这不是最快的解决方案,但它可以工作,您只需遍历数据即可。如果您不想这样做,则需要像其他解决方案建议的那样对数组进行洗牌。

于 2013-07-03T14:48:36.463 回答
1

尝试这个

$count = mysql_num_rows($query);
$randomArray = range(0, $count);
shuffle($randomArray);

for ($i = 0, $j = $count; $i < $j; $i++) {
    $random = array_shift($randomArray);
}
于 2013-07-03T14:51:26.360 回答
0

你在找下面的代码吗

function nonRepeat($min,$max,$count) {


    if($max - $min < $count) {
        return false;
    }

   $nonrepeatarray = array();
   for($i = 0; $i < $count; $i++) {
      $rand = rand($min,$max);


      while(in_array($rand,$nonrepeatarray)) {
        $rand = rand($min,$max);
      }

      //add it to the array
      $nonrepeatarray[$i] = $rand;
   }
   return $nonrepeatarray;
} 
于 2013-07-03T14:49:37.133 回答
0
$results=new array();
for($i = 0; $i < mysql_num_rows($query); $i++){
     $random = rand(000, 999);
     if(!in_array($random,$results) {
           array_push($results,$random);
     }
}
// you can print_r($results) here if you want
于 2013-07-03T14:49:52.413 回答
0

增加熵级别 - 或根据时间生成随机级别。PHP.net 有一个很好的例子:

// seed with microseconds
function make_seed() {
  list($usec, $sec) = explode(' ', microtime());
  return (float) $sec + ((float) $usec * 100000);
}
srand(make_seed());
$randval = rand();
于 2013-07-03T14:51:01.833 回答
0

就像是:

$random_values = array();
for($i = 0; $i < mysql_num_rows($query); $i++){
    $random = rand(000, 999);
    while(in_array($random, $random_values)) $random = rand(000, 999);
        $random_values[] = $random;
}
于 2013-07-03T14:51:15.873 回答