【问题标题】:Php not repeating random valuePHP不重复随机值
【发布时间】:2016-01-07 02:40:57
【问题描述】:

我怎样才能得到一个不重复的随机值,我试过这个但没有成功得到一个错误:

    $randomdate = mt_rand(1, 52);
    $newdate = shuffle($randomdate);
    echo $newdate;

得到了这个错误:

警告:shuffle() 期望参数 1 是数组,给定整数

【问题讨论】:

  • “不重复”是什么意思?试过rand(1,52); ?
  • 返回的 mt_rand 是整数而不是数组,如警告所示
  • 不重复我的意思是不重复一个已经随机的整数可以这么说。随机函数重复其自身 10 次。例如,它一开始是随机的 4,但在其他尝试中不应再重复 4
  • 但错误说明了一切:mt_rand 只回显一个整数。为了洗牌,你需要一个数组(可能更多的元素)。
  • 您是在问如何生成随机数或为什么shuffle 会生成错误。 从你的问题和 cmets 看不清楚

标签: php arrays random shuffle


【解决方案1】:

TL;DR

$nums = range(1, 52);
shuffle($nums);
while (sizeof($nums)) print array_pop($nums)."\n";

(感谢 XicoXperto 和 Kevinrob。)

完整版:

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

为此,您可以使用(不是特别棒的酱)shuffle()(您显然知道!)

shuffle() 仅对数组进行操作(因此您的错误消息)-因此我们需要生成一个从 1 到 52(包括 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)

【讨论】:

  • 您可以使用 range(1, 52) 代替循环 for ;)
  • 每次不要求成为列表的第一项时,更喜欢 array_pop 而不是 array_shift。这避免了所有元素的所有重新索引
  • 感谢 XicoXperto - 我是个傻瓜,因为我在生产中竭尽全力 ;-)
【解决方案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 );

?>

【讨论】:

  • 完美解决方案!也比我的快 5% 左右。
【解决方案3】:

你有两种方法可以做到这一点(我认为 atm)

第一种方式

$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) 将从$randomValues 列表中随机获得$totalRandomNumbers 的数量

第二种方式已移除

这需要大量的处理,这意味着更多的时间,所以我接受了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-20
    • 2017-11-12
    • 1970-01-01
    • 2013-02-21
    • 2013-07-29
    • 2017-10-01
    • 2011-06-19
    • 1970-01-01
    相关资源
    最近更新 更多