天天看點

paip.刮刮卡砸金蛋抽獎機率算法跟核心流程.#---抽獎算法需要滿足的需求如下:#---抽獎核心流程#---問題???更好的算法#---實際使用的擴充抽獎算法(帶獎品送完判斷和每使用者最大中獎判斷)#-------網上的抽獎算法Php#----java版本的..參考

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

1.可以控制中獎的機率

2.具有随機性

3.最好可以控制獎品的數量

4.根據使用者id或者ip、手機号、qq号等條件限制抽獎次數

初期就這些需求,然後根據網上的資料,采用了一種階段式抽取的方法,大家下面看一下整體的程式:

關聯的資料結構

 [id]      ,[activityid]      ,[awardname]      ,[awardcount]      ,[機率]

作者 老哇的爪子 attilax 艾龍,  email:[email protected]

轉載請注明來源: http://blog.csdn.net/attilax

//判斷每使用者每個活動的最大bingo數字...

if (bingoednum(uid,actid.tostring()) >= perusermaxbigonnum) {

return null;

}

   startawd()

if (awd == null)

// 判斷獎品是否送完

if (awdover(awd)) {

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;

protected awardx startaward(integer actid, string uid) {

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();

});

awardx awd = com.attilax.award.awdsvs.getbingoawd(li_fnl);

} else

 /**

     * 根據機率擷取中獎号碼

     */

    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;

    }

/**

 * @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中獎機率的抽獎算法程式代碼