在PHP中随机洗牌重组数组
要使PHP中的数组随机化,请使用如下shuffle()函数。
$array = range(1, 5); shuffle($array); // 随机数组
此功能有两个限制。第一个是它完全删除了您可能已设置的任何密钥关联。所以下面的数组。
$array=array('one'=>1,'two'=>2);
使用后将变成以下内容shuffle()。
Array ( [0] => 2 [1] => 1 )
一种解决方法是使用以下函数,该函数使用PHP函数array_rand()以随机顺序提取数组中的所有键,然后确保键关联就位。
function shuffle_me($shuffle_me){ $randomized_keys = array_rand($shuffle_me, count($shuffle_me)); foreach($randomized_keys as $current_key) { $shuffled_me[$current_key] = $shuffle_me[$current_key]; } return $shuffled_me; }
shuffle()函数的第二个限制是创建的随机性。为了粗略估计随机函数的随机性,可以使用以下代码。
$rangeStart = 1; $rangeEnd = 2; $loops = 100000; $results = array(); for($i=0;$i<=$loops;$i++){ $numbers = range($rangeStart,$rangeEnd); shuffle($numbers); // 在这里进行随机化 $results[] = implode(',',$numbers); }; $tmp = array_count_values($results); arsort($tmp); echo ''.print_r($tmp,true).''; $start = current($tmp); // 获得第一项 $end = end($tmp); // 得到最后一个项目 echo 'Start: '.$start.' End: '.$end.' Difference: '.($start-$end).'
';
此代码运行100,000次循环,每次创建一个包含值1和2的小数组时,将其随机化,然后将结果作为数字字符串存储在另一个数组中。循环之后,PHP函数array_count_values()用于计算每个值的创建次数,然后查看最低发生值和最高发生值之间的差。数量越大,随机函数越随机。这不应该用作绝对事实,因为随机数组有更多的因素在起作用,但是它给出了一个很好的近似值。
为了通过数组随机化功能获得良好的随机性,您应该使用Fisher-Yates随机播放。这是使用此算法的函数的示例。
function array_shuffle($array){ // 使用Fisher-Yates进行洗牌 $i = count($array); while(--$i){ $j = mt_rand(0,$i); if($i != $j){ // 交换项目 $tmp = $array[$j]; $array[$j] = $array[$i]; $array[$i] = $tmp; } } return $array; }
使用前面提到的随机测试代码,发现本地PHPshuffle()函数的平均差异为27,而Fisher-Yates随机播放的平均差异为273。
因此,如果随机性对您非常重要,那么您可能不应该使用该shuffle()函数。