Php不重复随机值

Php不重复随机值,php,arrays,random,shuffle,Php,Arrays,Random,Shuffle,如何获取不重复的随机值,我尝试了此操作但未成功,但出现错误: $randomdate = mt_rand(1, 52); $newdate = shuffle($randomdate); echo $newdate; 得到了这个错误: 警告:shuffle()要求参数1为数组,给定整数 你有两种方法(我认为是atm) 第一路 变量: $totalRandomNumbers是要获取的随机值的总和 $results将包含随机值的数组变量 $randomValues将是一个

如何获取不重复的随机值,我尝试了此操作但未成功,但出现错误:

    $randomdate = mt_rand(1, 52);
    $newdate = shuffle($randomdate);
    echo $newdate;
得到了这个错误:

警告:shuffle()要求参数1为数组,给定整数


你有两种方法(我认为是atm)

第一路 变量:

  • $totalRandomNumbers
    是要获取的随机值的总和
  • $results
    将包含随机值的数组变量
  • $randomValues
    将是一个包含所有可能值(1、2、3、4、…、50、51、52)的数组
逻辑: -
范围(1,52)
生成包含从1到52的所有值的数组 -
array\u rand($randomValues,$totalRandomNumbers)
将从
$randomValues
列表中随机获取
$totalRandomNumbers
的数量

第二条路已拆除 这将需要大量的处理,这意味着更多的时间,所以我把它


TL;博士

$nums = range(1, 52);
shuffle($nums);
while (sizeof($nums)) print array_pop($nums)."\n";
(感谢西科克斯佩托和凯文罗布。)

完整版本:

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

为此,您可以使用(不是特别棒的酱汁)
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

优化版(凯文罗布赞不绝口):

性能加倍:

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

另一个优化是关于
array\u shift
array\u pop
的优化-后者强度较小-它提供的“随机性”(仅在阵列的另一端工作)-多亏了XicoXperto

array_shift: 2.20s (100,000)
array_pop:   1.40s (100,000)
使用array\u rand()随机选取N个值(在本例中,是您所说的10倍),并使用range()设置限制,在您的示例中,从1到52

<?php

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

?>

或者,如果您想洗牌()结果,那么

<?php

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

?>


你说的“不重复”是什么意思?用
rand(1,52)进行试验?mt_rand的返回是整数而不是数组,正如警告所说的,不重复我的意思是不重复已经随机的整数。随机函数自身重复10次。例如,它的随机化4开始,但在另一个tries上不应该再重复4,但错误解释了这一切:
mt_rand
只回显一个整数。为了洗牌,你需要一个数组(可能包含更多的元素)。你是在问如何生成随机数还是
shuffle
为什么会生成错误。您的问题和评论不清楚您可以使用
范围(1,52)
而不是循环;)每次不要求将数组\u pop作为列表的第一项时,优先选择数组\u shift。这避免了所有元素的重新索引汉克斯·西科斯珀托-我是一个在生产中挤出最后一点的吸盘;-)干净利落的解决方案!也可以重复地比我的速度稍微快5%。
array_shift: 2.20s (100,000)
array_pop:   1.40s (100,000)
<?php

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

?>
<?php

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

?>