/*

 * 经典的概率算法,

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

}

$res['no'] = $pr;

print_r($res['yes']);

php概率的更多相关文章

  1. [bzoj2152][聪聪和可可] (点分治+概率)

    Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好 ...

  2. sqlserver中根据表中的配置概率取到数据

      create proc pr_zhanglei_test1 /*功能描述: 根据t_zhanglei_test1中perc设置的概率,取到相应数据old_id */ as declare @per ...

  3. 【BZOJ-3143】游走 高斯消元 + 概率期望

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2264  Solved: 987[Submit][Status] ...

  4. 【BZOJ-3270】博物馆 高斯消元 + 概率期望

    3270: 博物馆 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 292  Solved: 158[Submit][Status][Discuss] ...

  5. UVA1637Double Patience(概率 + 记忆化搜索)

    训练指南P327 题意:36张牌分成9堆, 每堆4张牌.每次拿走某两堆顶部的牌,但需要点数相同.如果出现多种拿法则等概率的随机拿. 如果最后拿完所有的牌则游戏成功,求成功的概率. 开个9维数组表示每一 ...

  6. caffe机器学习自带图片分类器classify.py实现输出预测结果的概率及caffe的web_demo例子运行实例

    caffe机器学习环境搭建及python接口编译参见我的上一篇博客:机器学习caffe环境搭建--redhat7.1和caffe的python接口编译 1.运行caffe图片分类器python接口 还 ...

  7. 【BZOJ1415】 [Noi2005]聪聪和可可 概率与期望

    其实题不难,不知提交了几次...不能代码MD...注意一些基本问题...SB概率题 #include <iostream> #include <cstdio> #include ...

  8. 【BZOJ3036】绿豆蛙的归宿 概率与期望

    最水的概率期望,推荐算法合集之<浅析竞赛中一类数学期望问题的解决方法> #include <iostream> #include <cstdio> using na ...

  9. IT人生知识分享:概率与运气

    前言: 最近的人生多了些体验,也读了些许书,感觉还是有些知识是可以分享的. 今天难得周六,特意开电脑了,花几个小时写写,和大伙分享分享点知识. 以下内容,更多的需要读者思考,所以结论不会写太清晰,但一 ...

  10. UVA11021 Tribles[离散概率 DP]

    UVA - 11021 Tribles GRAVITATION, n. “The tendency of all bodies to approach one another with a stren ...

随机推荐

  1. 基于Linq表达式做的一个简单的表达式生成器

    using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; ...

  2. 创建一个Java Web项目,获取POST数据并显示

    新建一个新的Java Web工程项目 打开IntelliJ IDEA 新建一个工程,选择选择Java Enterprise,设置Tomcat的安装目录,点击下一步. 选中Create project ...

  3. MYSQL入门总结

    创建数据库及创建表 create schema/database ttest(名字); //创建数据库 create table ttest(建好的数据库名字).new_table(表名字) ( a ...

  4. select poll和 epoll

    select .poll.epoll 都是多路io复用的机制,i/o多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知乡音的程序进行相应的读写操作.但s ...

  5. C++泛型算法总结

    1 accumulate(b,e,T) 累和(基础和为T) 注意T的类型必须和序列中元素类型相同,如double序列后面的T就必须是0.0,如果是0就会把序列中的数当成int进行求和 2 count( ...

  6. opencv:自适应阈值

    #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...

  7. the MTS failed last time时的解决办法

    关于6.6.3SP2版本提示The MTS failed last time 1.1    发生前提条件 在重启系统 shutdown -r now后,网页打不开,发现MTS服务无法启动,我自己涉及的 ...

  8. 矩阵快速幂+概率DP poj 3744

    题意:在一条不满地雷的路上,你现在的起点在1处.在N个点处布有地雷,1<=N<=10.地雷点的坐标范围:[1,100000000]. 每次前进p的概率前进一步,1-p的概率前进1-p步.问 ...

  9. go之二进制协议gob和msgpack

    文章引用自 二进制协议gob和msgpack介绍 本文主要介绍二进制协议gob及msgpack的基本使用. 最近在写一个gin框架的session服务时遇到了一个问题,Go语言中的json包在序列化空 ...

  10. docker 报错 docker: Error response from daemon: driver failed....iptables failed:

    现象: [root@localhost test]# docker run --name postgres1 -e POSTGRES_PASSWORD=password -p : -d postgre ...