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
将是一个包含所有可能值(1、2、3、4、…、50、51、52)的数组$randomValues
范围(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 );
?>