当前位置:编程学习 > 网站相关 >>

百度面试题之非随机过程洗牌

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

补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,