不确定人数的抽奖方法
很多年前就给前公司的年会做过年会抽奖,基本要求就是年会入场时签到,签到的员工都参与抽奖(也可以设置公司高管过滤,不参与抽奖),奖品是预设好的,到时候就是给所有签到员工编号,然后抽奖过程中不断生成一组随机数,这些随机数对应的编号的员工姓名和照片就显示出来,这是很容易想到的算法。 但是还要一种情况就是互联网模式的抽奖,有点像双十一之前,阿里派发红包一样,大家都可以在开始抽奖的时候去抽,奖品也是预设好的,比如1000W的奖金池,派发完毕就抽奖完毕,每个用户可以抽取多次。这种抽奖方式主要是应对抽奖人数不确定的情况,谁也不需要提前签到报名,到了抽奖时间只要注册用户都可以抽奖。 因为抽奖人数不确定,所以采用一人多次抽奖的方案是很好的,对用户来说也是,如果第一次没有抽中,还可以尝试第二次,第三次。具体算法上,其实更简单,因为用户点击抽奖的顺序是随机的,所以我们连随机数都不用用,直接给用户的一次抽奖请求编个自增的号,如果这个号满足中奖规则,那么就分配礼品,返回该抽奖请求中奖结果,如果不满足中奖规则,那么我们就返回未中奖。 为了避免用户频繁的点击,造成服务器过高的负担,我们可以在客户端设置一个动画过程,比如转盘抽奖,可以转几秒以后才请求服务器,看是否中奖,对用户来说也增加了趣味性。为了避免用户不通过客户端,直接发起频繁的HTTP请求来刷奖,我们甚至可以在服务器设置同一个用户的请求时间间隔。 下面贴出我写的一个示例代码部分,我设置了一个自增的整数Sequence ,每个正常的抽奖请求,则Sequence ++,另外设置默认的抽奖基数baseNumber=100,如果能够Sequence能够被baseNumber整除,那么就中奖,否则不中奖: [RoutePrefix( </span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">volatile</span> <span style="color: #0000ff;">int</span> Sequence = <span style="color: #800080;">1</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> IList<<span style="color: #0000ff;">int</span>> winnerList=<span style="color: #0000ff;">new</span> List<<span style="color: #0000ff;">int</span>><span style="color: #000000;">();
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 抽奖开始标记,请通过StartNewLotteryRound打开
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">bool</span> start = <span style="color: #0000ff;">false</span><span style="color: #000000;">;
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 所有产品都被抽完了的标记
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">bool</span> allPrizeOut = <span style="color: #0000ff;">false</span><span style="color: #000000;">;
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 当前轮次ID
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">int</span> currentRoundId = <span style="color: #800080;">0</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">public</span> ILotteryAppService LotteryAppService { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 抽奖基数,只要被该数整除就中奖
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">int</span> baseNumber =<span style="color: #800080;">100</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> IDictionary<<span style="color: #0000ff;">int</span>,DateTime> userDrawTime=<span style="color: #0000ff;">new</span> Dictionary<<span style="color: #0000ff;">int</span>,DateTime><span style="color: #000000;">();
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">bool</span> CheckUserDrawTime(<span style="color: #0000ff;">int</span><span style="color: #000000;"> userId)
{
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (userDrawTime.ContainsKey(userId))
{
</span><span style="color: #0000ff;">return</span> userDrawTime[userId].AddSeconds(<span style="color: #800080;">8</span>) < DateTime.Now;<span style="color: #008000;">//</span><span style="color: #008000;">8s后可以抽奖 </span>
<span style="color: #000000;"> }
(编辑:鲜蔬坊站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – ASP.NET MVC模型/ ViewModel验证
- asp.net – 我如何使用AJAX来确定用户的会话是否已过期,然后
- asp.net – 如何使用Inno Setup脚本创建IIS应用程序和应用程
- 从app_data中删除文件夹时如何防止asp.net重新编译?
- asp.net – 在WebForms中调试时关闭捆绑/缩小
- asp.net-mvc – UpdateModel前缀 – ASP.NET MVC
- asp.net中使用repeater和PageDataSource搭配实现分页代码
- ASP.NET C#ListBox服务器控件不会禁用
- Asp.Net Core中WebSocket绑定的方法详解
- asp.net-mvc – 如何在ASP.NET MVC4中使用具有唯一标识符UR
- asp.net-mvc – 在ASP.NET MVC中添加服务引用4
- ASP.NET 5针对dnx451 / dnx46性能
- asp.net-mvc – 我需要有关HandleError的更多信息
- asp.net-mvc – 如何在扩展方法中使用HTML帮助器
- 在asp.net中将用户变量存储在数据库与会话中
- asp.net – MS Chart for .NET预定义调色板颜色列
- asp.net core标签助手的高级用法TagHelper+Form
- asp.net读取excel文件的三种方法示例
- asp.net-mvc – MVC导航到不同的控制器视图
- Asp.Net Core中WebSocket绑定的方法详解