某大公司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";?>