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