博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法
阅读量:7058 次
发布时间:2019-06-28

本文共 1908 字,大约阅读时间需要 6 分钟。

php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法。用法很简单,代码里有详细注释说明,一看就懂

 

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
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
<!--?php
/*
 
* 经典的概率算法,
 
* $proArr是一个预先设置的数组,
 
* 假设数组为:array(100,200,300,400),
 
* 开始是从1,1000 这个概率范围内筛选第一个数是否在他的出现概率范围之内,
 
* 如果不在,则将概率空间,也就是k的值减去刚刚的那个数字的概率空间,
 
* 在本例当中就是减去100,也就是说第二个数是在1,900这个范围内筛选的。
 
* 这样 筛选到最终,总会有一个数满足要求。
 
* 就相当于去一个箱子里摸东西,
 
* 第一个不是,第二个不是,第三个还不是,那最后一个一定是。
 
* 这个算法简单,而且效率非常 高,
 
* 关键是这个算法已在我们以前的项目中有应用,尤其是大数据量的项目中效率非常棒。
 
*/
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;
}
 
 
/*
 
* 奖项数组
 
* 是一个二维数组,记录了所有本次抽奖的奖项信息,
 
* 其中id表示中奖等级,prize表示奖品,v表示中奖概率。
 
* 注意其中的v必须为整数,你可以将对应的 奖项的v设置成0,即意味着该奖项抽中的几率是0,
 
* 数组中v的总和(基数),基数越大越能体现概率的准确性。
 
* 本例中v的总和为100,那么平板电脑对应的 中奖概率就是1%,
 
* 如果v的总和是10000,那中奖概率就是万分之一了。
 
*
 
*/
$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
),
);
 
/*
 
* 每次前端页面的请求,PHP循环奖项设置数组,
 
* 通过概率计算函数get_rand获取抽中的奖项id。
 
* 将中奖奖品保存在数组$res['yes']中,
 
* 而剩下的未中奖的信息保存在$res['no']中,
 
* 最后输出json个数数据给前端页面()中。
 
*/
foreach ($prize_arr as $key => $val) {
    
$arr[$val[
'id'
]] = $val[
'v'
];
}
$rid = get_rand($arr);
//根据概率获取奖项id
 
$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'];"

转载地址:http://skfll.baihongyu.com/

你可能感兴趣的文章
Eclipse JEE中Server Options追踪
查看>>
关联规则Apriori算法
查看>>
Zabbix监控交换机,防火墙端口流量
查看>>
C++ 精度
查看>>
61、Heartbeat V1基于NFS共享存储的WEB高可用实战
查看>>
泛型数组问题
查看>>
Cisco HSRP排错
查看>>
Linux下查看tomcat连接数
查看>>
java 对象池
查看>>
成长中必须知道的20个故事
查看>>
aix下设置自动启动、关闭oracle
查看>>
Ocs 2007 迁移到 Lync的一些注意事项
查看>>
我的友情链接
查看>>
bash的字符处理工具及bash特性
查看>>
Input Director 一套键盘鼠标同时控制多台电脑
查看>>
Failure [INSTALL_FAILED_INVALID_APK]
查看>>
java 写入文件
查看>>
为什么你不能在 MySQL 3.x 版本上安装 Joomla 1.5.23
查看>>
PS(photoshop)抠图(切图)必备快捷键及要点简析
查看>>
Java拾遗:003 - ConcurrentHashMap源码解读
查看>>