Php不重复随机值

时间:2015-10-09 08:21:37

标签: php arrays random shuffle

我怎样才能得到一个不重复的随机值,我试过这个但是没有工作得到错误:

    $randomdate = mt_rand(1, 52);
    $newdate = shuffle($randomdate);
    echo $newdate;

得到了这个错误:

  

警告:shuffle()期望参数1为数组,给定整数

3 个答案:

答案 0 :(得分:2)

<强> TL; DR

$nums = range(1, 52);
shuffle($nums);
while (sizeof($nums)) print array_pop($nums)."\n";

(感谢XicoXperto和Kevinrob。)

完整版:

我从您的问题更新中了解到您的意思是“我想要一个唯一数字列表,随机排序”。

为此你可以使用(不是特别棒的酱汁)shuffle()(你很明显知道!)

shuffle()只对数组进行操作(因此你的错误信息) - 所以我们需要生成一个从1到52的整数数组:

$nums = array();                  // Declare empty array
for ($i = 1; $i <= 52; $i++) {    // From 1 to 52 inclusive
   $nums[] = $i;                  //   Populate unique numbers in array
}
shuffle($nums);                   // Shuffle array randomly

现在我们可以开始弹出/移出数组中的数字:

while (sizeof($nums) > 0) {
   print array_shift($nums) . "\n";
}

优化版本(对Kevinrob的称赞):

$nums = range(1, 52);             // Declare array of numbers 1..52
shuffle($nums);                   // Shuffle array randomly

表现加倍:

Loop:  0.48s (10,000)
Range: 0.26s (10,000)

提供了关于array_shift vs array_pop的另一个优化 - 后者不那么强 - 它不会给予“随机性”(只是在数组的另一端工作) - 感谢XicoXperto!

array_shift: 2.20s (100,000)
array_pop:   1.40s (100,000)

答案 1 :(得分:2)

使用 array_rand()随机选择N个值(在这种情况下,如你所说的10倍), range()来设置限制,在你的情况下,从1到52。

<?php

    print_r( array_rand( range( 1, 52 ), 10 ) );

?>

或者,如果你想 shuffle()结果,那么......

<?php

$numbers = array_rand( range( 1, 52 ), 10 ) ;
shuffle( $numbers );
print_r( $numbers );

?>

答案 2 :(得分:0)

你有两种方法可以做到这一点(我可以想到)

第一路

$totalRandomNumbers = 4;
$randomValues = range(1, 52);
$result = array_rand($randomValues, $totalRandomNumbers);

变量:

  • $totalRandomNumbers是您想要获得的随机值的总和
  • $results包含随机值的数组变量
  • $randomValues将是一个包含所有可能值的数组(1,2,3,4,...,50,51,52)

逻辑: - range(1, 52)生成包含1到52之间所有值的数组 - array_rand($randomValues, $totalRandomNumbers)会随机获得$totalRandomNumbers列表

$randomValues的金额

第二路 REMOVED

  

它会花费大量的处理时间,这意味着更多的时间,所以我接受了它