先完成后台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

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;

}

上述代码是一段经典的概率算法,$proArr是一个预先设置的数组,假设数组为:array(100,200,300,400),开始是从1,1000这个概率范围内筛选第一个数是否在他的出现概率范围之内, 如果不在,则将概率空间,也就是k的值减去刚刚的那个数字的概率空间,在本例当中就是减去100,也就是说第二个数是在1,900这个范围内筛选的。这样筛选到最终,总会有一个数满足要求。就相当于去一个箱子里摸东西,第一个不是,第二个不是,第三个还不是,那最后一个一定是。这个算法简单,而且效率非常高,关键是这个算法已在我们以前的项目中有应用,尤其是大数据量的项目中效率非常棒。

接下来我们通过PHP配置奖项。

?

1

2

3

4

5

6

7

8

$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),

);

该二维数组,记录了所有本次抽奖的奖项信息,其中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

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'];

}

$res['no'] = $pr;

echo json_encode($res);

另附上一个网友的实现方法

?

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

/**

  * 抽奖

  * @param int $total

  */

  function getReward($total=1000)

  {

  $win1 floor((0.12*$total)/100);

  $win2 floor((3*$total)/100);

  $win3 floor((12*$total)/100);

  $other $total-$win1-$win2-$win3;

  $return array();

  for ($i=0;$i<$win1;$i++)

  {

  $return[] = 1;

  }

  for ($j=0;$j<$win2;$j++)

  {

  $return[] = 2;

  }

  for ($m=0;$m<$win3;$m++)

  {

  $return[] = 3;

  }

  for ($n=0;$n<$other;$n++)

  {

  $return[] = '谢谢惠顾';

  }

  shuffle($return);

  return $return[array_rand($return)];

  }

  $data = getReward();

  echo $data;

  ?>

https://blog.csdn.net/pksport/article/details/80903403

php编写的抽奖程序中奖概率算法相关推荐

  1. 用php编写比赛评奖系统_php编写的抽奖程序中奖概率算法

    们先完成后台PHP的流程,PHP的主要工作是负责配置奖项及对应的中奖概率,当前端页面点击翻动某个方块时会想后台PHP发送ajax请求,那么后台PHP根据配置的概率,通过概率算法给出中奖结果,同时将未中 ...

  2. php 实现抽奖程序中奖概率算法

    请用PHP的array设计一种结构,用于配置抽奖活动,可以配置每种奖品不同的数量,中奖概率.并用文字或代码简要描述使用此数据结构进行抽奖的逻辑. 中奖概率算法(php 可用于刮刮卡,大转盘等抽奖算法) ...

  3. 游戏抽奖计算机原理,VB6.0编写电脑抽奖程序源码教程

    近年来在娱乐节目之中常常见到利用电脑来抽奖,笔者对其发生了兴趣遂自己动手用VB编了一个小程序来实现电脑抽奖的小功能,其原理如下: 主要利用VB中的Rnd函数,来实现随机查找和打乱排序的功能,从而实现随 ...

  4. java编写一个简单的模拟抽奖程序

    //郑州轻工业大学 //题号:实验一 第四题 //题目: 编写一个简单的模拟抽奖程序(模拟抽奖1.0),抽奖时需要输入5个116的整数号码,每个号码不能重复.程序运行后会随机生成5个116幸运号码,然 ...

  5. 一个可以设置中奖概率的抽奖程序[转]

    一个可以设置中奖概率的抽奖程序[转] using System; using System.Collections.Generic; using System.Linq;namespace Conso ...

  6. php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法

    php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法.用法很简单,代码里有详细注释说明,一看就懂 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...

  7. php中奖概率算法,刮刮卡/大转盘抽奖算法

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法 前言 一.概率算法 二.奖项数组 三.引用输出 总结 前言 以下是我整理的在项目中 ...

  8. 1.设计一个抽奖程序,程序通过随机方式产生中奖序号。程序可以设置序号包含数字位数 和最大序号,一次抽取几个中奖序号(最少 1 个序号,最多不超过 2 个序号)和总共中奖 人数(最少 5 人)。抽奖过程

    实验目的   掌握随机函数的使用 主要仪器设备及耗材    安装了 JDK1.8 的 PC 一台 实验内容 1.设计一个抽奖程序,程序通过随机方式产生中奖序号.程序可以设置序号包含数字位数 和最大序号 ...

  9. python随机抽号_使用python的random编写抽奖程序

    python代码的random模块,常用函数是random.random,random.randint,random.randrange,random.choice,random.shuffle. ① ...

最新文章

  1. php时区问题导致php页面显示不正常
  2. 19、HTML5 新的 Input 类型
  3. linux重命名的命令行操作,Linux rename命令批量重命名的方法
  4. PHP arrray_filter(), array_map()区别与应用
  5. Arcgis Javascript那些事儿(十二)——geometry service几何服务
  6. 通过设置proxyTable实现调用接口跨域
  7. python分割文本_python分割文本
  8. 车载以太网测试之实锤-基于电阻噪声和高斯噪声的SQI测试对比
  9. androidsettitle方法_在Android应用程序中,Toolbar.setTitle方法无效 - 应用程序名称显示为ti...
  10. dns服务器不可用了怎么修复,dns服务器可能不可用怎么解决(dns服务器最有效的解决方法)...
  11. TabWidget当前标签底线颜色
  12. Neo4j【有与无】【N4】构建图形数据库应用程序
  13. oracle 生成随机姓名_Oracle生成随机码
  14. java获取图片的长宽尺寸(毫米)
  15. 基于jsp+mysql+ssm酒店管理系统-计算机毕业设计
  16. 关于HP Diagnostics
  17. 一文梳理2020年大热的对比学习模型
  18. 闭包实现迭代器功能-- 每用一次函数,返回数组下一个值。 我们需要面对更为复杂的数据结构,他们通常会有这与数组截然不同的序列规则...
  19. jenkins-配置python
  20. 私密视频误发到微信群,如何避免视频扩散?

热门文章

  1. Table实现tr数据滚动
  2. 百度网盘百度云视频倍速播放方法 亲测有用 共6种,总有一个适合你
  3. CC2530无线RF,串口透传
  4. 使用restTemplate请求get接口下载文件
  5. 快速理解go语言错误与异常处理
  6. 借助 frp 随时随地访问自己的树莓派
  7. and门 simuilink_电力电子电路仿真MATLAB应用.PPT
  8. 断线式防盗报警器电路(六)
  9. python设置excel自动换行_python xlwt 存成excel并设置行高列宽,自动换行
  10. kaios好用吗_鸿蒙系统到底能不能够像印度KaiOS那么成功?成第四大操作系统?...