PHP几率算法问题
问题是这样子的:在一个物品合成系统中,需要使用几件不同的物品来合成宝石,有不同的几率生成一颗(50%)、两颗(16%)和三颗(2%)宝石,其余的为爆掉,即什么也得不到。
方法一
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 
 | 
 
 
 
 function lucky(){
 $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 = 0;
 
 $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;
 }
 }
 return $made_num;
 }
 
 $made_num = lucky();
 echo $made_num;
 
 
 | 
方法二
然后是第二种方法,逻辑简单的方法
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | $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);
 
 $d = mt_rand(0,99);
 echo $arr[$d];
 
 
 | 
方法三
第三种算法,其实与第一种方法是同样原理
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 
 | 
 
 
 
 
 
 
 
 
 
 
 
 function get_rand($proArr) {
 $result = '';
 
 $proSum = array_sum($proArr);
 
 foreach ($proArr as $key => $proCur) {
 $randNum = mt_rand(1, $proSum);
 if ($randNum <= $proCur) {
 $result = $key;
 break;
 } else {
 $proSum -= $proCur;
 }
 }
 unset ($proArr);
 return $result;
 }
 
 
 
 
 
 
 
 
 
 
 
 $prize_arr = array(
 '0' => array('id'=>1,'prize'=>'平板电脑','v'=>1),
 '1' => array('id'=>2,'prize'=>'数码相机','v'=>5),
 '2' => array('id'=>3,'prize'=>'音箱设备','v'=>10),
 '3' => array('id'=>4,'prize'=>'4G优盘','v'=>12),
 '4' => array('id'=>5,'prize'=>'10Q币','v'=>22),
 '5' => array('id'=>6,'prize'=>'下次没准就能中哦','v'=>50),
 );
 
 
 
 
 
 
 
 
 foreach ($prize_arr as $key => $val) {
 $arr[$val['id']] = $val['v'];
 }
 $rid = get_rand($arr);
 
 $res['yes'] = $prize_arr[$rid-1]['prize'];
 unset($prize_arr[$rid-1]);
 shuffle($prize_arr);
 for($i=0;$i<count($prize_arr);$i++){
 $pr[] = $prize_arr[$i]['prize'];
 }
 $res['no'] = $pr;
 print_r($res);
 
 |