zoukankan      html  css  js  c++  java
  • paip.刮刮卡砸金蛋抽奖概率算法跟核心流程.

    paip.刮刮卡砸金蛋抽奖概率算法跟核心流程.

    #---抽奖算法需要满足的需求如下: 1

    #---抽奖核心流程 1

    #---问题???更好的算法 2

    #---实际使用的扩展抽奖算法(带奖品送完判断和每用户最大中奖判断) 2

    #-------网上的抽奖算法Php 3

    #----java版本的.. 4

    参考 5

    #---抽奖算法需要满足的需求如下:

    1.可以控制中奖的概率

    2.具有随机性

    3.最好可以控制奖品的数量

    4.根据用户ID或者ip、手机号、QQ号等条件限制抽奖次数

    初期就这些需求,然后根据网上的资料,采用了一种阶段式抽取的方法,大家下面看一下整体的程序:

    关联的数据结构

     [id]      ,[activityId]      ,[awardName]      ,[awardCount]      ,[概率]

     

    作者 老哇的爪子 Attilax 艾龙,  EMAIL:1466519819@qq.com
    转载请注明来源: http://blog.csdn.net/attilax

    #---抽奖核心流程

    //判断每用户每个活动的最大bingo数字...

    if (bingoedNum(uid,actid.toString()) >= perUserMaxBigonNum) {

    return null;

    }

       StartAwd()

    if (awd == null)

    return null;

    // 判断奖品是否送完

    if (awdOver(awd)) {

    return null;

    Reutnr awd.

    #---问题???更好的算法

    网上的算法是没问题的,就是理解起来麻烦的...不是一个真实的阶段式抽取的方法...

    例如俄们子有一个奖品,算法的时候儿子要不个probability   概率算呱走ok...

    3个奖品,子要不个哪for给挂走ok兰木....

    public static Awardx getBingoAwd(List<Awardx> li) {

    int rdmAwdIndex_may=randomx.random(li.size()-1);

    System.out.println("may index::"+rdmAwdIndex_may);

    Awardx awd=(Awardx) li.get(rdmAwdIndex_may);

    int rdm=randomx.random(100);

    core.log("--o42910: rdmAwdIndex_may--rdm--awd.prbblt"+String.valueOf(rdmAwdIndex_may)+"--"+String.valueOf(rdm)+"--"+String.valueOf(awd.prbblt));

    if(rdm<awd.prbblt)

    {

    //bingo

    return awd;

    }

    return null;

    }

    #---实际使用的扩展抽奖算法(带奖品送完判断和每用户最大中奖判断)

    protected Awardx startAward(Integer actid, String uid) {

    if (bingoedNum(uid,actid.toString()) >= perUserMaxBigonNum) {

    return null;

    }

    List<ActAward> li = AwdListByActid(actid);

    List<Awardx> li_fnl = listUtil.map_generic(li,

    new Func_4SingleObj<ActAward, Awardx>() {

    @Override

    public Awardx invoke(ActAward o) {

    // 上午08:53:09 2014-4-29

    ActAward thisAwd = o;

    Awardx awd = new Awardx();

    awd.id = thisAwd.getId();

    awd.name = thisAwd.getAwardName();

    awd.prbblt = thisAwd.getRate();

    return awd;

    }

    });

    Awardx awd = com.attilax.award.AwdSvs.getBingoAwd(li_fnl);

    if (awd == null)

    return null;

    if (awdOver(awd)) {

    return null;

    } else

    return awd;

    }

    #-------网上的抽奖算法Php

     /**

         * 根据概率获取中奖号码

         */

        private 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;

        }

         

    }

    #----java版本的..

    /**

     * @category 获取中奖概率

     * 

     */

    private static ActAward getAwardRand(List<ActAward> awardList) {

    ActAward shootAward = null;

    /*return shootAward = awardList.get(0);*/

    //测试

    if (awardList != null && awardList.size() > 0) {

    int size = awardList.size();

    int seed = 10000;

    // 中奖总概率

    for (ActAward aa : awardList) {

    seed += aa.getRate();

    }

    // 循环奖项

    for (int i = 0; i < size; i++) {

    ActAward one = awardList.get(i);

    Random rand = new Random();

    // 获取1-100之间的概率

    int randNum = rand.nextInt(seed);

    logger.info("随机概率  >>> " + randNum);

    // 中奖了

    if (randNum <= i) {

    shootAward = one;

    break;

    } else {

    // 继续

    seed -= one.getRate();

    }

    }

    }

    return shootAward;

    }

    参考

    转轮抽奖的算法实现-Java-第七城市

    php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法 - PHP教程_PHP编程_PHP开发技术文章 红黑联盟

    PHP中奖概率的抽奖算法程序代码

  • 相关阅读:
    openlayers跨域设置后出现http status 500错误
    myeclipse 2014 闪退问题解决
    html跨域获取数据
    centos的nginx支持ssl
    Hadoop学习笔记---HDFS
    Nginx Web服务器配置
    用ReentrantLock和Condition实现线程间通信
    Android绘图机制和处理技巧
    自定义ViewPagerIndicator-视图指示器
    Docker学习笔记
  • 原文地址:https://www.cnblogs.com/attilax/p/5963987.html
Copyright © 2011-2022 走看看