侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

php实现概率性随机抽奖代码

php  /  管理员 发布于 7年前   235

1、初始数据:

权重越大,抽取的几率越高
[奖品1, 权重 5], [ 奖品2, 权重6], [ 奖品3, 权重 7], [ 奖品4, 权重2]

2、处理步骤:

1)N = 5 + 6 + 7 + 2 = 20
2)然后取1-N的随机数M
3)界定各 奖品的权重范围值 奖品 1 : 1-5 ; 奖品2 : 6-11; 奖品3: 12-18; 奖品4: 19-20
4) 如果M在某个奖品的权重范围值内,标识这个奖品被抽取到

id = $id;    $this->weight = $weight ? $weight : 0;    $this->name = $name ? $name : '随机奖品' . $id;  }   # id  public function getId() {    return $this->id;  }   # 权重  public function getWeight() {    return $this->weight;  }   # 设置权重范围区间  public function setRange($start, $end) {    $this->start = $start;    $this->end = $end;  }   # 判断随机数是否在权重范围区间  public function inRange($num) {    return ($num >= $this->start) && ($num <= $this->end);  }} /** * 奖品池 */class PrizePoll implements IteratorAggregate, Countable {  # 奖品集  protected $items = array();   # 加入奖品  public function addItem(Prize $item) {    $this->items[$item->getId()] = $item;    return $this;  }   # 删除奖品  public function removeItem($itemId) {    if (isset($this->items[$itemId])) {      unset($this->items[$itemId]);    }    return $this;  }   # 更新奖品  public function updateItem(Prize $item) {    if (isset($this->items[$item->getId()])) {      $this->items[$item->getId()] = $item;    }    return $this;  }   # 获取所有奖品  public function getItems() {    return $this->items;  }   # 所有所有可用奖品(如果权重为0,说明这个奖品永远不可能抽到)  public function getVisibleItems() {    $items = array();    foreach ($this->items as $item) {      if ($item->getWeight()) {        $items[$item->getId()] = $item;      }    }    return $items;  }   # Countable::count  public function count() {    return count($this->items);  }   # IteratorAggregate::getIterator()  public function getIterator() {    return new ArrayIterator($this->items);  }} /** * 简单的抽奖类 */class SimpleTurn {  # 奖池  protected $poll = null;     public function __construct(PrizePoll $poll) {    if ($poll) {      $this->setPoll($poll);    }  }   # 抽奖  public function run(PrizePoll $poll) {    $poll = $poll ? $poll : $this->poll;    if ( ! $poll) {      throw new Exception('奖池未初始化');    }     if ($poll->count() <= 0) {      throw new Exception('奖池为空');    }     $items = $poll->getVisibleItems();    if (count($items) <= 0) {      throw new Exception('奖池为空');    }     $sum = 0;    foreach ($items as $item) {      $start = $sum + 1;      $sum += $item->getWeight();      $end = $sum;       # 设置奖品的权重范围区间      $item->setRange($start, $end);    }     # 随机数    $rand = $this->getRandNum(1, $sum);     # 区间段判断    foreach ($items as $item) {      if ($item->inRange($rand)) {        return $item;      }    }    return null;  }   # 获取随机数  public function getRandNum($min, $max) {    return mt_rand($min ? $min : 1, $max);  }   # 设置奖池  public function setPoll(PrizePoll $poll) {    $this->poll = $poll;  }} # 示例try {  $prizePoll = new PrizePoll();  $prizePoll->addItem(new Prize(1, 5))    ->addItem(new Prize(2, 6))    ->addItem(new Prize(3, 7))    ->addItem(new Prize(4, 2));   $turn = new SimpleTurn($prizePoll);  $prize = $turn->run();  var_dump($prize);} catch (Exception $e) {  print_r($e);}

您可能感兴趣的文章:

  • php权重计算方法代码分享
  • php编写的抽奖程序中奖概率算法
  • php实现可以设置中奖概率的抽奖程序代码分享
  • 适用于抽奖程序、随机广告的PHP概率算法实例
  • php抽奖小程序的实现代码
  • 基于PHP实现简单的随机抽奖小程序
  • 基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
  • php实现自定义中奖项数和概率的抽奖函数示例
  • PHP编程实现计算抽奖概率算法完整实例
  • php简单计算权重的方法示例【适合抽奖类应用】


  • 上一条:
    PHP 读取文本文件内容并分页显示
    下一条:
    php实现给一张图片加上水印效果
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(95个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客