为什么我不能在PHP中使用shuffle正确地改组数组?

时间:2013-05-16 22:43:17

标签: php arrays random shuffle

这是一个重现我的问题的函数。我有一个阵列。数组内部是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]总是&#39; b&#39;:

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" } 

2 个答案:

答案 0 :(得分: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()为随机数生成器设定种子,因为现在这是自动完成的。

答案 1 :(得分:0)

我实际上尝试过你的代码,除了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永远是最后一次只是巧合。