我怎样才能得到一个不重复的随机值,我试过这个但是没有工作得到错误:
$randomdate = mt_rand(1, 52);
$newdate = shuffle($randomdate);
echo $newdate;
得到了这个错误:
警告:shuffle()期望参数1为数组,给定整数
答案 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
的金额
它会花费大量的处理时间,这意味着更多的时间,所以我接受了它