V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zoneself
V2EX  ›  程序员

[高手指点] 美团网的抽奖是什么原理?

  •  
  •   zoneself · 2014-10-18 08:33:10 +08:00 · 6498 次点击
    这是一个创建于 3700 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在网上搜了下,找到是这样的解释的:
    参与美团网的抽奖,
    会得到一个类似“459599”的抽奖号,
    抽奖规则如下:

    中奖号码计算办法
    开奖日收盘时的上证指数 × 收盘时的深证成指 × 10000 = 12位数。(指数以证交所公布数字为准);
    将此12位数的数字倒序排列后(如首位是0,则直接抹去),再除以截止至开奖日前一天23:59:59参加本次活动的人数(每个抽奖号为一个人数),得到的余数加1即为本次活动的最终获奖号码。
    如果当天需要开多个奖,则用此号码分别+2011 +3011 +4011……得出当天其他获奖号码。
    如果活动期间抽奖号码加值后超过了前一天的抽奖人数,则顺延至次日参加抽奖的抽奖号码
    如果开奖最后一天抽奖号码加值后抽奖号码超过了总参加人数,则将抽奖号码减去参加人数得到新的抽奖号码。
    若您的“抽奖号”与最终获奖号码完全一致,就可以获得本次活动的大奖啦!

    例如
    2012-08-28收盘时的上证指数是 2927.08,
    2012-08-28收盘时的深证成指是 12926.61,
    将这两个数字相乘后再乘以10000得到的12位数为378372215988,
    将这12位数的数字倒序排列得到889512273873。
    如果截止至2012-08-27 23:59:59活动结束时的抽奖人数为1907899,
    以889512273873整除以1907899,商为466226,余数为154699,
    用154699+1=154700,获奖即为154700,如果当天需要开多个奖,则用此号码分别+2011 +3011 +4011……得出当天其他获奖号码。

    这个抽奖规则美团抽奖页面中也是公开的,最近要做一个抽奖的程序,需要模仿美团网的这个规则,那么问题来了:
    1、美团网的这个中奖号码是如何产生的,怎么保证最后算的这个结果就一个在我产生的中奖号码里?
    2、这个算法公平吗?美团搞一个抽奖的活动会有那么多人参加,抽奖号范围很大,如果我们要搞活动人很少,几十个的话,最后算出的结果不在参加人的中奖号里,到那时就完鸟,木有一个人中奖。美团的大部分抽奖我每次都抽,没中过一次,表示怀疑,是不是也会出现这种情况,如果出现这个情况就内定一个,哈哈,这样就没有公平性了吧?
    10 条回复    2015-01-14 09:00:22 +08:00
    skydiver
        1
    skydiver  
       2014-10-18 08:57:28 +08:00
    算法里不是取模了么,怎么可能不在范围里
    zoneself
        2
    zoneself  
    OP
       2014-10-18 09:04:06 +08:00
    @skydiver 抱歉,第一个问题没写清楚,我的意思是 [ 会得到一个类似“459599”的抽奖号] 这里的这个459599是怎么产生的,怎么让中奖结果怎么在产生的随机号的范围内,中奖结果是有规则的,是可以算出来的。
    gamexg
        3
    gamexg  
       2014-10-18 09:06:42 +08:00
    顺序生生呗,第一个是1,第二个就是2了。
    zoneself
        4
    zoneself  
    OP
       2014-10-18 09:11:06 +08:00
    @gamexg 那么疑问就到了第二个问题了,美团搞活动知名度大的,好几十万人参加,而我们的活动人少,只有几十人,最多几百人,比如这期经过规则算出来的结果是:154700 递增出来的最多到几百,不会到这么大的数字呢。
    oa414
        5
    oa414  
       2014-10-18 09:18:47 +08:00
    @zoneself

    如果截止至2012-08-27 23:59:59活动结束时的抽奖人数为1907899,
    以889512273873整除以1907899,商为466226,余数为154699,
    用154699+1=154700,获奖即为154700,如果当天需要开多个奖,则用此号码分别+2011 +3011 +4011……得出当天其他获奖号码。


    你们的抽奖人数少,那就

    以889512273873整除以你们的抽奖人数,假设为100,商为8895122738,余数73.

    73 + 1 = 74. 获奖既为74
    livelazily
        6
    livelazily  
       2014-10-18 09:33:36 +08:00 via Android
    取余了所以总会少于总抽奖人数
    gamexg
        7
    gamexg  
       2014-10-18 10:27:02 +08:00
    楼上已经说的很清楚了。
    楼主是觉得数字小不好看还是觉得 154700 对不上你们的抽奖数?
    154700 是根据人数算出来的啊,你的抽奖人数少,算出来的154700 就小。

    >>再除以截止至开奖日前一天23:59:59参加本次活动的人数(每个抽奖号为一个人数),得到的余数加1即为本次活动的最终获奖号码。
    zoneself
        8
    zoneself  
    OP
       2014-10-18 10:33:52 +08:00
    @oa414 @livelazily @gamexg 嗯,谢谢,明白啦,另求:php抽奖算法,比如运用大乐透开奖号码来制订规则,有没有好的建议?
    dsgygb
        9
    dsgygb  
       2015-01-10 16:13:25 +08:00
    @zoneself 您最后是怎么处理的呢?我这边目前也有这个需求。
    zoneself
        10
    zoneself  
    OP
       2015-01-14 09:00:22 +08:00
    @dsgygb 哎,悔恨当初数学没学好,除数除以被除数取余数,余数肯定小鱼被除数的,是在可控范围内的。你可以找几个数字算一下呵呵,要是数学学好了,我就没有这么多的疑问啦。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4709 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:05 · PVG 18:05 · LAX 02:05 · JFK 05:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.