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

范围随机数生成,请指教!

  •  
  •   ck1llc ·
    ck1llc · 2016-04-11 11:23:27 +08:00 · 2864 次点击
    这是一个创建于 3147 天前的主题,其中的信息可能已经有所发展或是发生改变。
    之前提到过帮朋友做个东西 http://www.v2ex.com/t/269177 ,虽然我拒绝了,但是他有个随机生成算法问题问我。

    朋友希望号码随机范围是抽奖人数(总人数是 1w ,抽奖号码就是 1-10000 )。//想吐槽一下,网易的号码不都是一样长短的么

    然后涉及到随机号码分配的问题。//也想吐槽下,既然最后抽奖算法是随机的,号码随机不随机感觉没有必要

    他希望用户申请抽奖时,分配的号码是随机的,下个用户申请时,从剩余号码中再随机抽取一个。算法类似 http://www.cnblogs.com/eaglet/archive/2011/01/17/1937083.html

    我感觉这种算法有问题:如果将未分配的号码缓存起来,在活动比较多的时候会比较消耗内存;如果存数据库里,每次都要从数据库中读取未使用的数组,然后再随机取一个或多个,然后再更新数据库,步骤比较繁琐。

    我的建议:创建时,直接初始化随机排序的号码到数据库中,每次分配号码,按照顺序从表中读取指定数量未分配的号码即可。


    大家有没有好的建议?!
    12 条回复    2016-04-11 15:40:10 +08:00
    hitmanx
        1
    hitmanx  
       2016-04-11 12:34:40 +08:00
    我觉得你的方法挺好的呀,毕竟这只是分配号码的算法,而不是抽奖算法,只要不重复怎么快怎么来吧?
    9hills
        2
    9hills  
       2016-04-11 13:29:53 +08:00
    你的办法是好的。一个原则,数据能不实时生成就不实时生成。。。

    比如炉石传说的手牌,其实在换牌的一瞬间,所有牌的排序就固定了(除非用了影响牌堆的牌,比如挖宝之类)
    ck1llc
        3
    ck1llc  
    OP
       2016-04-11 14:05:15 +08:00
    @hitmanx @9hills 感谢支持,那我就让他这么搞了
    zonghua
        4
    zonghua  
       2016-04-11 14:07:53 +08:00 via iPhone
    随机生成下标,然后用下标取数组的元素
    ykrl089
        5
    ykrl089  
       2016-04-11 14:21:12 +08:00
    我觉得都放内存好了, 就算是一百万号码,在内存中也不过几个 mb 而已。
    ck1llc
        6
    ck1llc  
    OP
       2016-04-11 14:36:58 +08:00
    @ykrl089 活动不止一个呢,如果有几百个活动同时在进行呢
    tabris17
        7
    tabris17  
       2016-04-11 14:50:36 +08:00
    你说的是洗牌算法, shuffle
    gimp
        8
    gimp  
       2016-04-11 15:01:17 +08:00 via Android
    @ck1llc 那就加内存 :doge:
    hst001
        9
    hst001  
       2016-04-11 15:04:14 +08:00
    先生成号码按队列取下去就好了,反正要的是随机
    cc7756789
        10
    cc7756789  
       2016-04-11 15:14:50 +08:00
    分 100 组,每组 100 个号码, 0-99 、 100-199 、 200-299 。。。。。前 100 个人来抽奖,随机分配。至于奖项,随机分配给每一组的某个号码。不过还是直接打乱来得轻松。
    cevincheung
        11
    cevincheung  
       2016-04-11 15:27:25 +08:00
    redis spop
    zado
        12
    zado  
       2016-04-11 15:40:10 +08:00
    还是方内存简单,如果几百个活动同时进行也不太可能挤在一个服务器上。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2501 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:11 · PVG 09:11 · LAX 17:11 · JFK 20:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.