PHP游戏中的抽奖算法初探
本示例代码是一段经典的概率算法,$probability是一个预先设置的数组,假设数组为:array(10,20,30,40),
开始是从1,100这个概率范围内筛选第一个数是否在他的出现概率范围之内,
如果不在,则将概率空间,也就是k的值减去刚刚的那个数字的概率空间,在本例当中就是减去100,
也就是说第二个数是在1,900这个范围内筛选的。这样筛选到最终,总会有一个数满足要求。
就相当于去一个箱子里摸东西,第一个不是,第二个不是,第三个还不是,那最后一个一定是。
这个算法简单,而且效率非常高,关键是这个算法已在我们以前的项目中有应用,尤其是大数据量的项目中效率非常棒。
PHP+jQuery实现翻板抽奖Demo
<?php /** * 概率算法 * @param array $probability * @return integer|string */ function get_rand($probability) { // 概率数组的总概率精度 $max = array_sum($probability); foreach ($probability as $key => $val) { $rand_number = mt_rand(1, $max); if ($rand_number <= $val) { return $key; } else { $max -= $val; } } } // 概率比例 /* 接下来我们通过PHP配置奖项。 */ $data = array( array( "平板电脑","prob"=>1 ), array( "数码相机","prob"=>3 ), array( "音箱设备","prob"=>6 ), array( "8G优盘","prob"=>20 ), array( "10Q币","prob"=>25 ), array( "prize"=>"下次没准就能中噢","prob"=>50 ) ); |
$data中是一个二维数组,记录了所有本次抽奖的奖项信息,其中prize表示奖品,prob表示中奖概率。注意其中的prob必须为整数
你可以将对应的奖项的prob设置成0,即意味着该奖项抽中的几率是0
数组中prob的总和(基数),基数越大越能体现概率的准确性。
本例中prob的总和为100,那么平板电脑对应的中奖概率就是1%,如果prob的总和是1000,那中奖概率就是千分之一了。
<?php foreach ($data as $key=>$val) { $probability[$key] = $val["prob"]; } $n = get_rand($probability); $res['yes'] =$data[$n]["prize"]; unset($data[$n]); // 将中奖项从数组中剔除,剩下未中奖项 shuffle($data); // 将奖项顺序打乱 $func = create_function('$x','return $x["prize"];'); //$res['no'] = array_map(function($x){return $x[0];}, $data); // 除了中奖外的其他数据 $res['no'] = array_map($func, $data); // 除了中奖外的其他数据 echo json_encode($res); |
代码有点小错误
下面那个应该改成
foreach ($data as $key=>$val)
{
$probability[$key] = $val[“prob”];
}
$n = get_rand($probability);
$res[‘yes’] =$data[$n][0];
unset($data[$n]); // 将中奖项从数组中剔除,剩下未中奖项
shuffle($data); // 将奖项顺序打乱
$func = create_function(‘$x’,’return $x[0];’);
//$res[‘no’] = array_map(function($x){return $x[0];}, $data); // 除了中奖外的其他数据
$res[‘no’] = array_map($func, $data); // 除了中奖外的其他数据
echo json_encode($res);