百度面试题【非随机洗牌】

//所谓洗牌,就是将多个元素进行随机打乱。百度此个面试题的要求是不使用随机过程模拟随机。
//既然不可随机,那么我们只能使用序列化的规则去在结果中模拟随机。
//最初,我的想法是不断冒泡,给个盐值进行播种停止。后发现分布率不佳,够改用将元素化为一个
//二维数组进行数组元素操作
//算法如下。该算法效果依旧有分布率的问题,但结果较好。我们可以使用一个种子去播种,实现一种随机化。
//主流的都是使用时间种子播种
//欢迎大家一起来讨论该题
//本人email misko_lee@hotmail.com


/***百度面试题: 使用非随机算法洗牌*/
function get_rand_2($arr){
        for($i=0;$i<9;$i++){
            $row=1;
            $col=1;
            if(($i+1)%3==0){
                $row=-1;
            }
            if($i==8) $row=-8;
          //  echo 'row'.$row;
            for($j=0;$j<8;$j++){
                    
                    if($j<=6){
                        
                    $temp=$arr[$i][$j];
                    $arr[$i][$j]=$arr[$i+$row][$j+$col];
                    
                   // echo '===='.$arr[$i+$row][$j+$col];
                    $arr[$i+$row][$j+$col]=$temp;
                    }
                else{
                
                    $temp=$arr[$i+$row][$j];
                    $arr[$i+$row][0]=$arr[$i][$j];
                    $arr[$i][$j;

      
                }
  
            }
        }
        return $arr;

}
$a=array();
for($i=0;$i<9;$i++){
    for($j=0;$j<8;$j++){
       /* if($i==6){
            if($j==6 || $j==7){
                $a[$i][$j]='null';
                continue;
            }
        }
        */
        $a[$i][$j]=$i.$j;
    }
}
echo '<pre>';
    for($d=0;$d<20;$d++){
        $a=get_rand_2($a);
    for($i=0;$i<9;$i++){
        for($j=0;$j<8;$j++){
            echo $a[$i][$j].' &nbsp';
        }
        echo '<br>';
    }
    echo '<hr>';
    }
posted @ 2012-12-02 20:21  Misko_Lee  阅读(186)  评论(0编辑  收藏  举报