前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >php实现根据概率配置随机抽奖

php实现根据概率配置随机抽奖

作者头像
仙士可
发布2019-12-19 14:42:57
1.8K0
发布2019-12-19 14:42:57
举报
文章被收录于专栏:仙士可博客
代码语言:javascript
复制
这是我写的一个比较简单的抽奖算法,并没有很严谨,用于我自己写的wap文字游戏(美味小镇)上的随机食材,可以设定概率值

<?php

/**
 * Created by PhpStorm.
 * User: tioncico
 * Date: 2017/12/9 0009
 * Time: 14:50
 */
class Rand
{
    public $arr,$not_id,$if_repeat,$odds;
    public function __construct($arr,$if_repeat=1)
    {
        $this->arr=$arr;
        $this->if_repeat=$if_repeat;
        $this->get_odds_array();
    }
    function action($num=1)
    {
        if(!$this->arr||!$this->odds){
            return false;
        }
        $ids = array();
        for ($i = 0; $i < $num; $i++) {
            $res = $this->get_rand($this->arr, $this->odds);
            if ($this->if_repeat == 0) {
                if(count($this->arr)<=count($ids)){
                    return $ids;
                }
                if (in_array($res, $ids)) {
                    $i--;
                } else {
                    $ids[] = $res;
                }
            } else {
                $ids[] = $res;
            }
        }
        return $ids;
    }
    public function get_odds_array($arr=array())
    {
        $arr||$arr = $this->arr;
        foreach ($arr as $k => $va) {
            if(empty($va['odds'])){
                $va['odds']=100;
            }
            $odds[$k] = $va['odds'];
        }
        $this->odds = array_sum($odds);
        return $this;
    }

    public function add_arr($arr=array()){
        $this->arr = array_merge($this->arr,$arr);
        return $this;
    }

    function remove_id($arr=array(),$not_id=array()){
        $arr||$arr = $this->arr;
        $not_id||$not_id = $this->not_id;
        if(empty($not_id)){
            $this->arr = $arr;
            return $this;
        }
        foreach($arr as$k=> $va){
            foreach($not_id as $vo){
                if($k==$vo){
                    unset($arr[$k]);
                }
            }
        }
        $this->arr = $arr;
        return $this;
    }

//返回概率
    function get_rand($arr=array(), $odds=0)
    {
        $arr||$arr = $this->arr;
        $odds||$odds = $this->odds;
        //概率数组循环
        $randNum = mt_rand(1, $odds);
        $odd_num = 0;
        foreach ($arr as $key => $va) {
            if ($randNum > $odd_num && $randNum <= $va['odds'] + $odd_num) {
                return $arr[$key];
                break;
            } else {
                $odd_num += $va['odds'];
            }
        }
        unset ($proArr);
    }

}

$arr=array(
    array(
       'id'=>1,
       'odds'=>100//相对概率值
    ),
    array(
       'id'=>2,
       'odds'=>10//相对概率值
    ),
    array(
       'id'=>3,
       'odds'=>200//相对概率值
    ),
)

调用方法 
$a = new Rand($arr);
$a->action(1);

本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/03/23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档