PHP抽獎程式之機率演算法
阿新 • • 發佈:2019-02-14
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];
|