paip.刮刮卡砸金蛋抽奖概率算法跟核心流程.
paip.刮刮卡砸金蛋抽奖概率算法跟核心流程.
#---实际使用的扩展抽奖算法(带奖品送完判断和每用户最大中奖判断) 2
#---抽奖算法需要满足的需求如下:
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中奖概率的抽奖算法程序代码
paip.刮刮卡砸金蛋抽奖概率算法跟核心流程.的更多相关文章
- php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法
php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法.用法很简单,代码里有详细注释说明,一看就懂 <?php /* * 经典的概率算法, * $proArr是一个预先设置的数组, * 假设数组为: ...
- 中奖概率算法(php 可用于刮刮卡,大转盘等抽奖算法)
<?php //中奖概率算法(php 可用于刮刮卡,大转盘等抽奖算法) /* * 经典的概率算法, * $proArr是一个预先设置的数组, * 假设数组为:array(100,200,300, ...
- js实现刮刮卡抽奖
刮刮卡抽奖是前端活动页常见的功能: 链接:图像擦除插件(下载及教程讲解) 推荐理由:无缝刮痕,兼容性好,上手简单 插件有些要修改的地方,打开图像擦除插件后可以看下方网友讨论,或者直接下载本博 ...
- 网页闯关游戏(riddle webgame)--H5刮刮卡的原理和实践
前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. 对于刮刮卡, 想必大家都很熟悉, 也很喜 ...
- 用c#开发微信 (16) 微活动 2 刮刮卡
微信营销是一种新型的营销模式,由于微信更重视用户之间的互动,故而这种营销推广不不能盲目地套用微博营销的单纯大量广告推送方式.这种方式在微信营销中的效果非常差,会令用户反感,继而取消去企业或商家的微信公 ...
- Atitit .html5刮刮卡的gui实现总结
Atitit .html5刮刮卡的gui实现总结 #----两个案例canvas或者wScratchPad-1.4.4 1 #----1.添加panel ,这个十mask div.....posti ...
- qt qml 刮刮卡效果
用canvas+mouseArea实现的刮刮卡效果. 表层是一层色彩,用手指划开,可看到下面的文字Lisence: MIT, 请保留本文档说明Author: surfsky.cnblogs.com 2 ...
- Html5实现移动端、PC端 刮刮卡效果
刚从南方回来就分了一个刮刮卡效果的页面,特么的我在烦恼怎么用H5去实现这个效果呢,好不容易写出来了,产品居然说:“既然你可以写出来这个效果那当然好了,开始我只是打算让你实现点击就出现呢!”… … 尼玛 ...
- 用BlendFunc实现舞台灯光和刮刮卡效果
[转]http://code.lovemiao.com/?p=136#more-136 之前写过一篇<不规则形状按钮的点击判定>,利用了CCRenderTexture创建一块画布,可以在上 ...
随机推荐
- java 查询 mongodb 中的objectid
网上找了很久查询objectid的方法都是错的,用mongovue能查询出来,但就是用java不知道怎么查询 1.mongovue里的查询方式: {"_id" : ObjectId ...
- redis hash map
redis hash的使用详见文章:http://www.miaoyueyue.com/archives/235.html hash操作命令如下: hset(key, field, value):向名 ...
- Python学习第八天(os)
os主要是实现文件夹的创建和管理功能 os.mkdir(path) 创建目录 os.chdir(path)改变当前工作目录 os.fchdir() 通过文件描述符改变工作目录 os.chroot() ...
- 20145225唐振远 实验二 "Java面向对象程序设计"
20145225<Java程序设计> 实验二 Java面向对象程序设计 实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S ...
- .net委托(转载)
一.什么是委托? 委托就是定义一个 对于方法的引用,类似于c++中的函数指针.委托是用来将方法作为参数 传递进入其它方法的, 委托的格式? 修饰符1 delegate 修饰符2 委托类型名(变量n ...
- 拉格朗日乘子法和KKT条件
拉格朗日乘子法(Lagrange Multiplier)和KKT(Karush-Kuhn-Tucker)条件是求解约束优化问题的重要方法,在有等式约束时使用拉格朗日乘子法,在有不等约束时使用KKT条件 ...
- js中比较实用的时期格式化
在javascript中,关于时间格式的转换. 可以将“2010-1-2” 转换为 “2010-01-02 00:00:00” 或者将“2010-1-2 2:13:6" 转换为 “2010- ...
- lsof 简介
lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传输控制协议 ...
- iOS自动适配
自iphone4s以后,苹果先后推出了iphone5.iphone5s.iphone6.iphone6plus.iphone6s.iphone6splus这些新的机型,它们的屏幕大小各有所异,从此给我 ...
- python学习笔记:Day01
一.python 简介 1. python是Guido van Rossum在1989年圣诞节期间,为了打发无聊的假期而编写的一个编程语言 2. pyhton主要应用于数据分析.组件集成.网络 ...