mssql制作抽奖程序思路及源码,抽奖小程序

问题:excel怎么创设抽奖小程序?

那一个抽奖小程序选取了  Jscex 和 HTML5 Canvas API 制作。在线演示地址:
www.oschina.net/r2.html 。

从 1 ~ 62,一共有 62 人,从中间要公允地抽取出 拾人,而且不重复。所以,初阶判断,那是三个简易的任意抽取进度,有 N
个数,从中抽出 M 个(M < N)。直接随机抽取是最不难想到的:

抽奖程序:

回答:岁尾了,很多商行年会都有抽奖环节,你还在弱弱的应用把名字写好放入抽奖箱的原本方法吧?其实大家只要一台电脑上的EXCEL就能够达成自由抽奖成效,听起来高大上的样板,哈!先看动态效果图:

请使用 chrome
浏览器访问有响动),使用firefox浏览器无声音),使用IE浏览器不能够履行)。此程序仅供osc使用,不符合通用景况,因为有无数相差,你能够在那基础上改正并享受给大家。

直白抽取

const cards = Array(62).fill().map((_,i)=>i+1); //初始化一个 1~62 的数组

function draw(n = 1){ // 一次抽取 n 个,默认一次 1 个
    var ret = [];
    for(var i = 0; i < n; i++){
        let idx = Math.floor(cards.length * Math.random());
        ret.push(...cards.splice(idx, 1));
    }
    return ret;
}
console.log(draw(10)); //抽取一次,10个中奖者

上面那一个本子是月影实际现场写出的(略有修改),它是毋庸置疑的,不过它也有综上可得缺陷。首先它先把全体的牌都排序了,但实际上只必要排序
10 张牌就好,多余的排序没有须要。其次,它不方便人民群众延续抽奖,比如第②回抽取
10 个号,然后再想多抽取 5 个号,它就做不到了。

笔者们先化解第三个难题:

思路整理,无非便是点一个按钮,然后多少个图片旋转一会就出来个结实就行了,可这些顺序的渴求不是那样的,是亟需从数据库中肆意抽取用户,依照数据库中钦定的阶段和食指,一键全体抽出来结果就行了。同时要求仓库储存到数据库。还索要1个导出的职能。

图片 1如上图,按住F9键就能够私行抽奖了,名字随机生成!

代码片段(2)

不供给洗全体的牌

function draw(amount, n = 1){
    const cards = Array(amount).fill().map((_,i)=>i+1); 

    for(let i = amount - 1, stop = amount - n - 1; i > stop; i--){
        let rand = Math.floor((i + 1) * Math.random());
        [cards[rand], cards[i]] =  [cards[i], cards[rand]];
    }
    return cards.slice(-n);
}
console.log(draw(62, 10));

地点那几个本子是优化过的版本,明显假若取 10 个数,只供给循环 10回即可,不需求把 64 张牌都洗了。

要缓解能够接连抽奖的题材,就必要把 cards 提取出来(如同方案 1
的人身自由抽取一样),不过这样的话就使得函数有副成效,虽说是一时半刻写叁个抽奖,也不希罕设计得太糙。或然,那就加八个构造器执行发轫化?

不能遗漏的是,假若经过自由数依据id来抽取的话,必要考虑id不总是的题材,假使一切取出id也不现实。尽量少的去读写数据库。

现实制作方法:

作用图预览

构造器负责起先化

function Box(amount){
    this.cards = Array(amount).fill().map((_,i)=>i+1); 
}
Box.prototype.draw = function(n = 1){
    let amount = this.cards.length, cards = this.cards;

    for(let i = amount - 1, stop = amount - n - 1; i > stop; i--){
        let rand = Math.floor((i + 1) * Math.random());
        [cards[rand], cards[i]] =  [cards[i], cards[rand]];
    }

    let ret = cards.slice(-n);    
    cards.length = amount - n;

    return ret;
}

var box = new Box(62);
console.log(box.draw(5), box.draw(5)); //一次取 5 个,取 2 次

数据库:

1.第叁把名字输入到表格在那之中,设定肆个人作品体现中奖职员和工人名字的单元格(能够大学一年级点方便彰显),在单元格输入公式

图片 2

更优雅的化解方法?

事实上,对于叁遍或许抽取任意八个获奖人的气象,用 ES6 的
generators
万分合适,大家能够直接拿洗牌的版本略做修改:

function * draw(amount){
    const cards = Array(amount).fill().map((_,i)=>i+1); 

    for(let i = amount - 1; i >= 0; i--){
        let rand = Math.floor((i + 1) * Math.random());
        [cards[rand], cards[i]] =  [cards[i], cards[rand]];
        yield cards[i];
    }
}
var drawer = draw(62);

console.log(Array(10).fill().map(()=>drawer.next().value)); //一次取出10个结果

终极补充二个小技巧,利用 Array(n).fill().map(…)
能够一本万利飞快地布局数组:

Array(10).fill().map((_,i) => i+1); // 得到 [1,2,3,4,5,6,7,8,9,10]

复制代码 代码如下:

图片 3

Jscex 和 HTML5 CanvasAPI
制作。在线演示地址: www.oschina.net/r2.html 。 请使用 chrome
浏览器访问有响动),使用firefox浏览…

CREATE TABLE [dbo].[users](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [name] [nvarchar](50) NOT NULL,
    [phone] [nvarchar](50) NULL,
 CONSTRAINT [PK_table1] PRIMARY KEY CLUSTERED
(
    [mssql制作抽奖程序思路及源码,抽奖小程序。id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY
= OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

2.抉择B列名字,设置单元格条件格式

CREATE TABLE [dbo].[result](
 [id] [int] IDENTITY(1,1) NOT NULL,
 [usersid] [int] NOT NULL,
 [awardsid] [int] NOT NULL,
 CONSTRAINT [PK_result] PRIMARY KEY CLUSTERED
(
 [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  =
ON) ON [PRIMARY]
) ON [PRIMARY]

图片 43.末段按住F9键不放就能够完结自由抽奖功效了!也可把名字改成成奖品名称,那随机展现的便是奖状了,能够用来展现职员和工人随机抽中的奖品是何等!

CREATE TABLE [dbo].[awards](
 [id] [int] IDENTITY(1,1) NOT NULL,
 [Name] [nvarchar](50) NOT NULL,
 [Number] [int] NOT NULL,
 CONSTRAINT [PK_awards] PRIMARY KEY CLUSTERED
(
 [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  =
ON) ON [PRIMARY]
) ON [PRIMARY]

公式解析:

CREATE VIEW [dbo].[view1]
AS
SELECT     dbo.result.id AS resultid, dbo.users.id, dbo.users.name,
dbo.users.phone, dbo.awards.Name AS awardname
FROM         dbo.awards INNER JOIN
                      dbo.result ON dbo.awards.id = dbo.result.awardsid
INNER JOIN
                      dbo.users ON dbo.result.usersid = dbo.users.id

由和七个函数综合应用合成,randbetween是回来贰个在于钦点数字的自由数,INDEX是回到给定单元格的值,randbetween显示的是一个数字,用index把那几个数字代表的值(名字)显示出来!

CREATE PROCEDURE [dbo].[getranddata]
–这几个地方的参数是后台调用传的参数,八个变量之间供给“,”号分别
@count int, –剩余奖项大小
@awards int –奖项的id
AS BEGIN
–那些地点定义的参数是储存进程之中用到的
DECLARE @minid int –最大id
DECLARE @maxid int –最小id
DECLARE @randnum int –随机数一时变量
DECLARE @exist int –查询结果