【问题标题】:Why can't I shuffle an array properly with shuffle in PHP?为什么我不能在 PHP 中使用 shuffle 正确地对数组进行洗牌?
【发布时间】:2013-05-16 22:43:16
【问题描述】:

这是一个重现我的问题的函数。我有一个数组。数组内部是array( 0 => 'l', 1 => 'j', 2 => 'b')。请注意,无论我做什么,b 总是在最后。

private function fixed_shuffle($data_a, $data_b, $data_c) {
    $return_value[] = $data_a;
    $return_value[] = $data_b;
    $return_value[] = $data_c;

    for ($i=0; $i <= 10; $i++) {

      srand((double)microtime * 1000000);

      shuffle($return_value);

      var_dump($return_value);

      echo "<br />";

      echo implode(",",$return_value);

      echo "<br />";
    }
}

问题演示,注意[2]总是'b':

Current set separated by commas is 'j,l,b'.
Current answer is 'b'.
array(3) { [0]=> string(1) "l" [1]=> string(1) "j" [2]=> string(1) "b" }
l,j,b
array(3) { [0]=> string(1) "j" [1]=> string(1) "l" [2]=> string(1) "b" }
j,l,b
array(3) { [0]=> string(1) "l" [1]=> string(1) "j" [2]=> string(1) "b" }
l,j,b
array(3) { [0]=> string(1) "j" [1]=> string(1) "l" [2]=> string(1) "b" }
j,l,b
array(3) { [0]=> string(1) "l" [1]=> string(1) "j" [2]=> string(1) "b" }
l,j,b
array(3) { [0]=> string(1) "j" [1]=> string(1) "l" [2]=> string(1) "b" }
j,l,b
array(3) { [0]=> string(1) "l" [1]=> string(1) "j" [2]=> string(1) "b" }
l,j,b
array(3) { [0]=> string(1) "j" [1]=> string(1) "l" [2]=> string(1) "b" }
j,l,b
array(3) { [0]=> string(1) "l" [1]=> string(1) "j" [2]=> string(1) "b" }
l,j,b
array(3) { [0]=> string(1) "j" [1]=> string(1) "l" [2]=> string(1) "b" }
j,l,b
array(3) { [0]=> string(1) "l" [1]=> string(1) "j" [2]=> string(1) "b" } 

【问题讨论】:

    标签: php arrays random shuffle


    【解决方案1】:

    好吧,你一遍又一遍地将srand()重置为相同的值,使原始的输出已知,而原始输出的输出恰好是原始的,所以它忠实地来回翻转:

    var_dump((double)microtime * 100000);
    

    PHP 注意:使用未定义的常量 microtime - 在第 1 行的命令行代码中假定为“microtime”
    浮动(0)

    var_dump((double)microtime(true) * 100000);
    

    浮点数(1.3687445399327E+14

    修复它会修复它,但是,你可以just omit the srand():

    注意:从 PHP 4.2.0 开始,不需要使用 srand() 或 mt_srand() 为随机数生成器播种,因为现在这是自动完成的。

    【讨论】:

      【解决方案2】:

      我实际上尝试了您的代码,除了microtime 之外,它似乎对我有用。这是我的结果:

      j, l, b
      array(3) { [0]=> string(1) "j" [1]=> string(1) "b" [2]=> string(1) "l" }
      j, b, l
      array(3) { [0]=> string(1) "l" [1]=> string(1) "j" [2]=> string(1) "b" }
      l, j, b
      array(3) { [0]=> string(1) "l" [1]=> string(1) "b" [2]=> string(1) "j" }
      l, b, j
      array(3) { [0]=> string(1) "l" [1]=> string(1) "b" [2]=> string(1) "j" }
      l, b, j
      array(3) { [0]=> string(1) "l" [1]=> string(1) "j" [2]=> string(1) "b" }
      l, j, b
      array(3) { [0]=> string(1) "b" [1]=> string(1) "l" [2]=> string(1) "j" }
      b, l, j
      array(3) { [0]=> string(1) "b" [1]=> string(1) "j" [2]=> string(1) "l" }
      b, j, l
      array(3) { [0]=> string(1) "j" [1]=> string(1) "l" [2]=> string(1) "b" }
      j, l, b
      array(3) { [0]=> string(1) "l" [1]=> string(1) "j" [2]=> string(1) "b" }
      l, j, b
      array(3) { [0]=> string(1) "j" [1]=> string(1) "l" [2]=> string(1) "b" }
      j, l, b
      

      我只是觉得b总是最后一个只是巧合。

      【讨论】:

        猜你喜欢
        • 2018-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-12
        • 2021-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多