首页 > JavaScript, PHP > PHP游戏中的抽奖算法初探

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);
分类: JavaScript, PHP 标签: ,
  1. billy
    2013年6月19日14:18 | #1

    代码有点小错误
    下面那个应该改成
    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);

  1. 本文目前尚无任何 trackbacks 和 pingbacks.