要在1000W个手机号中 抽取一个手机号码(假设手机号码是唯一的)   奖金是很丰富的 需要公证处公证的界面上显示姓名和手机号码,以及两个按钮:开始、停止,点击开始后,姓名和手机号不断滚动,点停止,则确定中奖用户。
打算用BS架构做,手机号在数据库存着,实在没有思路。。
数据量小的话可以把数据都取出来,在js里循环,但是数据量太大了。。怎么做呢,必须是公平的,每个手机号中奖的几率是平等的。。单纯从这些数据中抽取一条是比较简单的,概率也是均等的,但是加上界面上的展示。。除非滚动速度足够快,机会才是均等的吧。。
求大神们帮帮忙

解决方案 »

  1.   

    貌似难点在数据量大吧。但是自己索引还不如用数据库呢,random 排序取第一个,然后返回。 
    不知道数据库1000w的量要多久。要是取巧点,其实你抽奖这个动作要多久呢?
    假设1分钟,你算下滚动速度,其实1分钟比如只能滚动1000条的话。
    你就第一次乱序取1000条。 然后在前端滚动这1000条。从概率上说,大概有点不一样吧。 但是我觉得这个是公平的吧?
      

  2.   


    这个方法更讨巧~~ 赞。
    按确定那下真正随即一下,就把最后抽那下随即1000W条会有点时间。
    比如:7秒。 那么效果看上去不好吧?在你的基础上稍微改动下,要是做得效果好点就这样。
    1)取1W条,随便滚动。
    2)按下【确定】时,1000W里随机去取最终号码。
    同时滚动不要停,只是减慢速度。
    3)把1)取到的号码慢慢滚上来,然后停住。
      

  3.   

    另外求教一下 在数据库随机取一条 怎么写这个sql?
      

  4.   

    这个没啥问题。
    你注意控制好重复提交之类的问题,比如别不小心双击了结果抽出两个特等奖,
    或者重复抽中同一个人之类的这种问题就行了。
    什么数据库?比如 SQL Server
      Select Top 1 phone
      From 表
      Order By rand()主要计算量在排序,1000W个号码,可能还真得花点时间。
    如果要预处理然后抽奖时能快速搞定的话,你就这样做:
    建议提前准备好每个 phone 的"奖票" rand() 值,比如:
      Update 表 Set ticket = rand()
    注意对ticket这个字段做好索引!抽奖时就很方便啦:
      Select Top 1 phone
      From 表
      Where ticket >= rand()
    不过要做个以防万一的纠错机制,如果Select出空记录,就重新执行一次这句话,
    不过发生概率确实是非常非常低。