1. 程式人生 > >PHP抽獎程式之機率演算法

PHP抽獎程式之機率演算法

http://www.nonb.cn/blog/php-probability.html

做PHP確實很少接觸演算法問題
前幾天遇到一個PHP機率演算法問題,很有意思,
大致就是一個抽獎程式
貴重物品出現機率低,便宜物品出現機率高
網上找打了答案,在下面評論中看到了另一種方法,我覺得更好,效率更高

轉來這個問題,和我之前遇到的差不多,
問題是這樣子的:在一個物品合成系統中,需要使用幾件不同的物品來合成寶石,有不同的機率生成一顆(50%)、兩顆(16%)和三顆(2%)寶石,其餘的為爆掉,即什麼也得不到。

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 //初始化陣列 $stone_arr = array( array( 'num' => 1, 'prob' => '50%' ), array( 'num' => 2, 'prob' => '16%' ), array( 'num' => 3, 'prob' => '2%' ) ); //隨機獲得一個幸運數字 $luck_num = mt_rand( 0, 99 ); //初始化機率區間和最終寶石生產數目 $lucky_range = $made_num = 0; foreach( $stone_arr as $sa ){ $prob = intval( $sa[
'prob'] ); if( $luck_num >= $lucky_range && $luck_num < $lucky_range + $prob ){ $made_num = $sa['num']; break; } else{ $lucky_range += $prob; } } for( $i = 0; $i < $made_num; $i++ ){ //生產寶石的邏輯 }

然後是第二種方法,我喜歡的方法,不知道數量多了效率會不會也有問題

?
1 2 3 4 5 6 7 8 $a = array_fill(0,50, 1); $b = array_fill(0,16, 2);
$c = array_fill(0,2, 3); $d = array_fill(0,32, 0); $arr = array_merge($a, $b, $c); //var_dump($arr); $d = mt_rand(0,99); echo $arr[$d];