这是很久以前博客园的博客,打个小样。

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

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

  1. 使用自带的函数

    1
    2
    3
    4
    5
    6
    7
    8
    function shuffle_rand1($arr)
    {
    echo "原来数组为:";
    print_r($arr);
    shuffle($arr);
    echo "<br>乱序数组为:";
    print_r($arr);
    }
  2. 第一时间想到的方法,就是随机取值,赋值给新的数组

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    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);
    }
  3. 数组中随机取一个元素赋值给新的数组,然后将原数组最后一位赋值到该位置,数组长度减一,继续重复上述步奏

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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);
    }
  4. 在具有n个元素的数组中,对0到n-1一次进行与一个随机位置元素进行交换,这种方法不需要新建一个数组,直接在原数组中进行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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);
    }