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中奖概率的抽奖算法程序代码

  • 相关阅读:
    51 Nod 1068 Bash游戏v3
    51 Nod Bash 游戏v2
    51 Nod 1073 约瑟夫环
    UVA 12063 Zeros and ones 一道需要好好体会的好题
    51 Nod 1161 Partial sums
    2018中国大学生程序设计竞赛
    UVA 11971 Polygon
    UVA 10900 So do you want to be a 2^n-aire?
    UVA 11346 Possibility
    python with as 的用法
  • 原文地址:https://www.cnblogs.com/attilax/p/5963987.html
Copyright © 2011-2022 走看看