某大公司PHP笔试题目如下:
请写一个程序,随机打印“0”、“1”、“2”,但保证“0”、“1”、“2”出现的概率是可配置的,例如2:1:3。
乍一看,解决方法油然而生——
<?PHP $a=$b=$c=0; $array = array(0,0,1,2,2,2); for($i=1;$i<6001;$i++){ $t = array_rand($array); if($t==0){ $a++; } if($t==1){ $b++; } if($t==2){ $c++; } } echo $a; echo "\n"; echo $b; echo "\n"; echo $c; echo "\n"; ?>
结果什么样,我没想到~~~~
概率没控制住啊~~~
最后在网上找到了一个比较不错的方法,其实想想真的挺简单的,就是没转过来,哈哈哈~~~
<?PHP $a=$b=$c=0; for($i=1;$i<6001;$i++){ $temp = rand(0,60); if($temp<20){ $a++; }elseif(20<=$temp&&$temp<30){ $b++; }else{ $c++; } } echo $a; echo "\n"; echo $b; echo "\n"; echo $c; echo "\n"; ?>
结果不错~~
重写成函数:
<?PHP function getRandom($array,$rate){ $rate = explode(':',$rate); $sum = 0; $left = 0; $right = 0; foreach($rate as $value){ $sum+=$value*10; } $temp = rand(0,$sum); foreach($rate as $key=>$value){ $right+=$value*10; if($left<=$temp && $temp<$right){ return $array[$key]; } $left+=$value*10; } } $array = array(0,1,2,3); $rate = '2:1:3:5'; $a=$b=$c=$d=0; for($i=0;$i<1100;$i++){ if(getRandom($array,$rate)==0){ $a++; } if(getRandom($array,$rate)==1){ $b++; } if(getRandom($array,$rate)==2){ $c++; } if(getRandom($array,$rate)==3){ $d++; } } echo $a; echo "\n"; echo $b; echo "\n"; echo $c; echo "\n"; echo $d; echo "\n"; ?>