在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()函数。