PHP不重复随机值

标签 php arrays random shuffle

如何获得不重复的随机值,我尝试了这个但没有工作并出现错误:

    $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_shiftarray_pop 提供的另一种优化 - 后者强度较低 - 它会提供同样的“随机性”(仅在数组的另一端工作) ) - 感谢 XicoXperto!

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

关于PHP不重复随机值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33033343/

相关文章:

C 指针和数组

c - 迭代迭代字符串数组(指针值似乎得到 "stuck")

php - 将数组从模型返回到 Controller codeigniter

javascript - 选择选项后自动显示数据库值

PHP MySQL : remember previous RAND()

php - 销售每月在线服务

c++ - 来自随机数生成器包装器 (C++) 的令人困惑的内联行为

php - 验证以检查用户名是否已存在于数据库中而不加载新页面

php - 下一个和上一个mysql数据库随机记录

C++ Boost随机数生成问题