如何获得不重复的随机值,我尝试了这个但没有工作并出现错误:
$randomdate = mt_rand(1, 52);
$newdate = shuffle($randomdate);
echo $newdate;
并收到此错误:
Warning: shuffle() expects parameter 1 to be array, integer given
最佳答案
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
与 array_pop
提供的另一种优化 - 后者强度较低 - 它会提供同样的“随机性”(仅在数组的另一端工作) ) - 感谢 XicoXperto!
array_shift: 2.20s (100,000)
array_pop: 1.40s (100,000)
关于PHP不重复随机值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33033343/