我们先完成后台PHP的流程,PHP的主要工作是负责配置奖项及对应的中奖概率,当前端页面点击翻动某个方块时会想后台PHP发送ajax请求,那么后台PHP根据配置的概率,通过概率算法给出中奖结果,同时将未中奖的奖项信息一并以JSON数据格式发送给前端页面。
先来看概率计算函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <span> 1</span> <span> function </span> get_rand(<span> $proArr </span><span>) {
</span><span> 2</span> <span> $result </span> = '' <span>;
</span><span> 3</span>
<span> 4</span> <span>
<span> 5</span> <span> $proSum </span> = <span> array_sum </span>(<span> $proArr </span><span>);
</span><span> 6</span>
<span> 7</span> <span>
<span> 8</span> <span> foreach </span> (<span> $proArr </span> <span> as </span> <span> $key </span> => <span> $proCur </span><span>) {
</span><span> 9</span> <span> $randNum </span> = <span>mt_rand</span>(1, <span> $proSum </span><span>);
</span><span>10</span> <span> if </span> (<span> $randNum </span> $proCur <span>) {
</span><span>11</span> <span> $result </span> = <span> $key </span><span>;
</span><span>12</span> <span> break </span><span>;
</span><span>13</span> } <span> else </span><span> {
</span><span>14</span> <span> $proSum </span> -= <span> $proCur </span><span>;
</span><span>15</span> <span> }
</span><span>16</span> <span> }
</span><span>17</span> <span>unset</span> (<span> $proArr </span><span>);
</span><span>18</span>
<span>19</span> <span> return </span> <span> $result </span><span>;
</span><span>20</span> }
|
登录后复制
上述代码是一段经典的概率算法,$proArr是一个预先设置的数组,假设数组为:array(100,200,300,400),开始是从1,1000这个概率范围内筛选第一个数是否在他的出现概率范围之内, 如果不在,则将概率空间,也就是k的值减去刚刚的那个数字的概率空间,在本例当中就是减去100,也就是说第二个数是在1,900这个范围内筛选的。这样筛选到最终,总会有一个数满足要求。就相当于去一个箱子里摸东西,第一个不是,第二个不是,第三个还不是,那最后一个一定是。这个算法简单,而且效率非常高,关键是这个算法已在我们以前的项目中有应用,尤其是大数据量的项目中效率非常棒。
接下来我们通过PHP配置奖项。
1 2 3 4 5 6 7 8 | <span>1</span> <span> $prize_arr </span> = <span> array </span><span>(
</span><span>2</span> '0' => <span> array </span>( 'id' =>1, 'prize' => '平板电脑' , 'v' =>1),
<span>3</span> '1' => <span> array </span>( 'id' =>2, 'prize' => '数码相机' , 'v' =>5),
<span>4</span> '2' => <span> array </span>( 'id' =>3, 'prize' => '音箱设备' , 'v' =>10),
<span>5</span> '3' => <span> array </span>( 'id' =>4, 'prize' => '4G优盘' , 'v' =>12),
<span>6</span> '4' => <span> array </span>( 'id' =>5, 'prize' => '10Q币' , 'v' =>22),
<span>7</span> '5' => <span> array </span>( 'id' =>6, 'prize' => '下次没准就能中哦' , 'v' =>50),
<span>8</span> );
|
登录后复制
该二维数组,记录了所有本次抽奖的奖项信息,其中id表示中奖等级,prize表示奖品,v表示中奖概率。注意其中的v必须为整数,你可以将对应的奖项的v设置成0,即意味着该奖项抽中的几率是0,数组中v的总和(基数),基数越大越能体现概率的准确性。本例中v的总和为100,那么平板电脑对应的中奖概率就是1%,如果v的总和是10000,那中奖概率就是万分之一了。
每次前端页面的请求,PHP循环奖项设置数组,通过概率计算函数get_rand获取抽中的奖项id。将中奖奖品保存在数组$res['yes']中,而剩下的未中奖的信息保存在$res['no']中,最后输出json个数数据给前端页面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span> 1</span> <span> foreach </span> (<span> $prize_arr </span> <span> as </span> <span> $key </span> => <span> $val </span><span>) {
</span><span> 2</span> <span> $arr </span>[<span> $val </span>[ 'id' ]] = <span> $val </span>[ 'v' <span>];
</span><span> 3</span> <span>}
</span><span> 4</span>
<span> 5</span> <span> $rid </span> = get_rand(<span> $arr </span>); <span>
<span> 6</span>
<span> 7</span> <span> $res </span>[ 'yes' ] = <span> $prize_arr </span>[<span> $rid </span>-1][ 'prize' ]; <span>
<span> 8</span> <span>unset</span>(<span> $prize_arr </span>[<span> $rid </span>-1]); <span>
<span> 9</span> <span>shuffle</span>(<span> $prize_arr </span>); <span>
<span>10</span> <span> for </span>(<span> $i </span>=0;<span> $i </span> count (<span> $prize_arr </span>);<span> $i </span>++<span>){
</span><span>11</span> <span> $pr </span>[] = <span> $prize_arr </span>[<span> $i </span>][ 'prize' <span>];
</span><span>12</span> <span>}
</span><span>13</span> <span> $res </span>[ 'no' ] = <span> $pr </span><span>;
</span><span>14</span> <span> echo </span> json_encode(<span> $res </span>);
|
登录后复制
以上就介绍了php 中奖概率算法,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。