最近在做小程序的时候,需要一个这样的需求:小程序界面有九宫格抽奖、转盘抽奖界面,总共有8个抽奖产品,每个产品的中奖概率是确定的,需要根据抽奖概率进行抽奖。

以下是该需求的简版Demo实现。复杂一点需要在奖品表增加比较多的字段来满足需求,比如产品类型、已使用数量、总数量、产品图片地址、是否删除、创建时间、创建人、最后更新时间、最后更新人等等。

数据准备

已知奖品1-8(笔记本电脑、小米手机、100元话费、0元话费、20元话费、10元话费、3元话费、谢谢惠顾)的中奖概率分别为:0.05%、0.15% 、9.8% 、10%、 10% 、15%、 25%、 30%。根据中奖概率可以在数据库表中配置odds字段的数值。

一般情况下把未中奖也设置成一个奖品,比如上面的谢谢惠顾

-- 奖品表
CREATE TABLE [dbo].[tblPrize] ([Id] int  IDENTITY(1,1) NOT NULL, -- 主键[ProductName] nvarchar(50) COLLATE Chinese_PRC_CI_AS  NULL, --奖品名称[odds] int  NULL --奖率
)
INSERT INTO [dbo].[tblPrize] ([Id], [ProductName], [odds]) VALUES (N'1', N'笔记本电脑', N'5')
INSERT INTO [dbo].[tblPrize] ([Id], [ProductName], [odds]) VALUES (N'2', N'小米手机', N'15')
INSERT INTO [dbo].[tblPrize] ([Id], [ProductName], [odds]) VALUES (N'3', N'100元话费', N'980')
INSERT INTO [dbo].[tblPrize] ([Id], [ProductName], [odds]) VALUES (N'4', N'50元话费', N'1000')
INSERT INTO [dbo].[tblPrize] ([Id], [ProductName], [odds]) VALUES (N'5', N'20元话费', N'1000')
INSERT INTO [dbo].[tblPrize] ([Id], [ProductName], [odds]) VALUES (N'6', N'10元话费', N'1500')
INSERT INTO [dbo].[tblPrize] ([Id], [ProductName], [odds]) VALUES (N'7', N'3元话费', N'2500')
INSERT INTO [dbo].[tblPrize] ([Id], [ProductName], [odds]) VALUES (N'8', N'谢谢惠顾', N'3000')

两种实现方式(sqlserver存储过程实现)

实现思想:根据中奖概率取整(odds字段中的8个整数),把整数求和得到一个整数和A,根据这个整数和生成一个随机数B,看随机数B是在哪个范围就是中到了哪个奖品。

下面两个实现方式中的的B为10000。

方式一

ALTER PROCEDURE [dbo].[LuckyDraw]
AS
BEGIN
-- 九宫格抽奖
DECLARE @randnum int
DECLARE @rownum int
DECLARE @num1 int
DECLARE @num2 int
DECLARE @num3 int
DECLARE @num4 int
DECLARE @num5 int
DECLARE @num6 int
DECLARE @num7 int
DECLARE @num8 int
DECLARE @ptid int            select @num1=odds from tblPrize where  id=1
select @num2=odds from tblPrize where  id=2
select @num3=odds from tblPrize where  id=3
select @num4=odds from tblPrize where  id=4
select @num5=odds from tblPrize where  id=5
select @num6=odds from tblPrize where  id=6
select @num7=odds from tblPrize where  id=7
select @num8=odds from tblPrize where  id=8set @randnum= cast(ceiling(rand() * 10000) as int)
if (@randnum>0 and @randnum<=@num1)set @rownum=1
else if(@randnum>@num1 and @randnum<=@num1+@num2)set @rownum=2
else if(@randnum>@num1+@num2 and @randnum<=@num1+@num2+@num3)set @rownum=3
else if(@randnum>@num1+@num2+@num3 and @randnum<=@num1+@num2+@num3+@num4)set @rownum=4
else if(@randnum>@num1+@num2+@num3+@num4 and @randnum<=@num1+@num2+@num3+@num4+@num5)set @rownum=5
else if(@randnum>@num1+@num2+@num3+@num4+@num5 and @randnum<=@num1+@num2+@num3+@num4+@num5+@num6)set @rownum=6
else if(@randnum>@num1+@num2+@num3+@num4+@num5+@num6 and @randnum<=@num1+@num2+@num3+@num4+@num5+@num6+@num7)set @rownum=7
elseset @rownum=8select @ptid=id from (select row_number() over(order by id) as rownum,id from tblPrize )t where t.rownum=@rownum   select @ptid id, @randnum randnum --得到中奖的奖品ID和随机数END

方式二:使用游标

ALTER PROCEDURE [dbo].[LuckyDraw_cur]
AS
BEGIN
-- 九宫格抽奖
DECLARE @randnum int
DECLARE @idnum int
DECLARE @oddsnum int
declare @beginindex int=0
declare @endindex intset @randnum= cast(ceiling(rand() * 10000) as int)declare cur cursor  for select id,odds from tblPrize  order by id;open cur fetch next from cur into @idnum,@oddsnum while @@fetch_status=0beginset @endindex=@beginindex + @oddsnumif(@randnum>@beginindex and @randnum<=@endindex)beginbreak;endset @beginindex=@endindexfetch next from cur into @idnum,@oddsnum endclose curDEALLOCATE cur     select @idnum id, @randnum randnum --得到中奖的奖品ID和随机数
END

两种方式的优劣

方式二更灵活,比如假如奖品数量变少和增多(比如奖品变成5个或10个,一般转盘抽奖不会是固定的八个奖品),不需要修改存储过程的代码。而方式一中的数量是写死的,增加或减少中奖的数量需要修改代码。

sqlserver实现抽奖Demo相关推荐

  1. lucky-canvas轮盘抽奖demo

    轮盘抽奖demo 微信小程序 前言 一.在微信小程序中使用 前言 对微信小程序开发不是很熟悉的,可以去参考一下之前的博客 微信小程序快速入门 一.在微信小程序中使用 npm 安装 先找到小程序项目的根 ...

  2. socket.io简单说明及在线抽奖demo

    socket.io简单说明及在线抽奖demo socket.io 简介 Socket.IO可以实现实时双向的基于事件的通信. 它适用于各种平台,浏览器或设备,也同样注重可靠性和速度. socket.i ...

  3. iOS积分抽奖Demo,可以人为控制不同奖项的得奖率

    最近公司让写一个转盘积分抽奖的样式,所以把创建过程中的心得记录一下,给大家分享 首先创建了相关的图片转盘,指针图片,然后就是考虑转盘如何旋转的问题,我是通过给指针图片添加一个动画效果,从而实现旋转效果 ...

  4. 基于React跑一个简易版九宫格抽奖

    写在前面,年会将至,需求自然也跟各种抽奖有关啦.最近刚好接了一个紧急的九宫格抽奖需求,顺便也记录一下撸这个简易九宫格的过程吧. 本文可能涉及以下内容: 九宫格布局 九宫格动效 抽奖逻辑处理 前后端联调 ...

  5. 在微信小程序上实现抽奖功能

    前言 本教程是基于 "apifm-wxapi" 模块,教你快速实现小程序开发,所以你可能需要先了解以下知识点: <创建 HelloWorld 项目> <使用 &q ...

  6. jQuery实现多位数的数字纵向滚动抽奖(自适应任何屏幕)

    示例图: <!DOCTYPE html> <html> <meta http-equiv="Content-Type" content="t ...

  7. LocalDB的使用详解

    LocalDB是什么 我们知道微软有一个SQL Server的免费版本SQL Server Express,它是作为学习以及构建桌面或小型服务器应用的入门级的免费数据库.但是作为编程人员,还是觉得体积 ...

  8. 3维DEMO: 抽奖圆盘

    抽奖圆盘 前些日子去超市,消费满一定钱数可以参加抽奖,就是在电视机上有个可旋转的圆盘,按一键开始,按一键抽奖结束.看到最大奖的扇形区域大约有个10度角的样子,按说中大奖的概率应该是36分之1.当然,这 ...

  9. HTML5 Canvas圆盘抽奖应用DEMO演示

    我们经常参加各种电商优惠活动,比如购买达到一定数额进行抽奖活动,在比如微信抽奖,淘宝抽奖,迅雷赚钱宝圆盘抽奖活动等.这些抽奖活动部分就是由HTML5的Canvas来制作的,今天就为大家分享一下如何使用 ...

最新文章

  1. gRPC in ASP.NET Core 3.x -- Protocol Buffer, Go语言的例子(下)
  2. 基于SLS构建RDS审计合规监控
  3. 别再用if-else了,用注解去代替他吧
  4. meta 标签的学习
  5. 【转载】MySQL5.6.27 Release Note解读(innodb及复制模块)
  6. docker基础4--docker的命令
  7. Android LitePal
  8. 【JavaScript 封装库】BETA 1.0 测试版发布!
  9. Linux root找回密码的方法
  10. word中将宏模块添加到Normal.dotm模板中
  11. 图神经网络实战案例-新冠疫苗项目实战,助力疫情!
  12. UE4 碰撞射线检测
  13. linux os版本 32或64位查看
  14. Java 集合之TreeSet 自定义类 比较器
  15. 树形选择排序(锦标赛排序)
  16. 新的深度学习优化器Ranger: RAdam + LookAhead的协同组合,两者兼得。
  17. 完全卸载TeamViewer与重新安装TeamViewer 7(含单文件版V12主控端)
  18. 关于Linux系统重启过慢问题解决方案
  19. java-网络文件下载器
  20. 【Linux】基础IO-回顾C语言文件操作

热门文章

  1. 这几十个前端炫酷库你都知道吗?
  2. Github 上火热的十个 Python 项目,从Debug工具到AI水军、量化交易系统。
  3. 2021山丹一中高考成绩查询,2019年张掖中考分数线,张掖中考录取分数线(出炉)
  4. html表白画画,超可爱·少女心·表白简笔画:我喜欢你,你就得跟我在一起!
  5. Arduino + AD9851 DDS信号模块 频率控制字和相位控制字写入
  6. android主流视频直播sdk,Android视频直播SDK集成指引
  7. 著名全球最大同性交友社区网站
  8. 创造与魔法怎么自建服务器,创造与魔法开服卷怎么获得 创造与魔法怎么得开服券...
  9. Java播放MP3播放音频
  10. C/C++关于行末空格的控制输出