如何将一个数组乱序?

前几天php实习面试,问到一个问题:如何将一个数组乱序?
答:使用自带的array_rand()或者shuffle()函数,或者用随机数取值赋值给新的数组。
又问:万一一直随机到同一个数怎么办?
那就进行判断,如果已经取过的位置,重新选取随机数。
这样问题就来了:随着新数组长度增加,原数组中的随机数选取碰撞几率会原来越大,最后几乎是一直碰撞的。也没有想出更好的办法。

后来回家后查了一下,总结一下,有以下几种方法:

  1. 使用自带的函数
function shuffle_rand1($arr)
{
	echo "原来数组为:";
	print_r($arr);
	shuffle($arr);
	echo "<br>乱序数组为:";
	print_r($arr);
}
  1. 第一时间想到的方法,就是随机取值,赋值给新的数组
function shuffle_rand2($arr)
{
	echo "原来数组为:";
	print_r($arr);
	$len = count($arr);
	$shuffle_arr = array();
	while(count($shuffle_arr)<$len){
		$index = rand(0,$len-1);
		if(!in_array($index, $shuffle_arr)){
			$shuffle_arr[] = $index;
		}
	}
	$newarr = array();
	foreach ($shuffle_arr as $v) {
		$newarr[] = $arr[$v];
	}
	echo "<br>新的数组为:";
	print_r($newarr);
}
  1. 数组中随机取一个元素赋值给新的数组,然后将原数组最后一位赋值到该位置,数组长度减一,继续重复上述步奏
function shuffle_rand3($arr)
{
	echo "原来数组为:";
	print_r($arr);
	$len = count($arr);
	$shuffle_arr = array();
	while($len>0){
		$index = rand(0,$len-1);
		$shuffle_arr[] = $arr[$index];
		$arr[$index] = $arr[$len-1];
		$len--;
	}
	echo "<br>新的数组为:";
	print_r($shuffle_arr);
}
  1. 在具有n个元素的数组中,对0到n-1一次进行与一个随机位置元素进行交换,这种方法不需要新建一个数组,直接在原数组中进行
function shuffle_rand4($arr){
	echo "原来数组为:";
	print_r($arr);
	$len = count($arr);
	for($i=0;$i<$len;$i++){
		$index = rand(0,$len-1);
		$temp = $arr[$i];
		$arr[$i] = $arr[$index];
		$arr[$index] = $temp;
	}
	echo "<br>新的数组为:";
	print_r($arr);
}
posted @ 2016-12-26 14:18  四个二带俩王  阅读(731)  评论(0编辑  收藏  举报