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

问一个一元夺宝号码生成问题

  •  
  •   liuzhen ·
    liuzhen9327 · 2016-10-10 18:00:18 +08:00 · 3706 次点击
    这是一个创建于 2962 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前提

    有 A 、 B 两种商品可以让用户认购
    
    每认购一份则生成一个号码
    
    不同商品产生的号码可以相同
    
    且最终开奖也从号码中抽取
    

    关于号码的随机生成

    假定 A 商品需要认购满 5000 件才开始揭晓获奖者
    
    那么
    
    用户认购 100 份,就要生成 100 个号码
    
    
    怎么保证在同一个商品中的号码只被一个用户使用呢?
    
    我目前想到的方法有性能缺陷
    
    想听一下 V 友们的意见:)
    
    第 1 条附言  ·  2016-10-10 18:38:47 +08:00
    已解决,可以不用回复了。谢谢两位:)
    15 条回复    2016-10-11 09:37:49 +08:00
    freeminder
        1
    freeminder  
       2016-10-10 18:05:06 +08:00
    额,认购有记录的吧,不用额外数据就行呀,记录的 id 就是抽奖号码。最后满足抽奖条件时在记录表上面 random 一下不就完了。不明白什么意思。。
    liuzhen
        2
    liuzhen  
    OP
       2016-10-10 18:08:40 +08:00
    @freeminder “在记录表上面 random 一下” 这句我没太看明白~
    liuzhen
        3
    liuzhen  
    OP
       2016-10-10 18:13:50 +08:00
    不能 append 了

    以问题中的假定为例:我想最终的号码规则是: 100005000 以内的数字

    前面的 10000 是固定加的,后面的 5000 代表总需要的认购数

    然后用户认购 100 份,需要在 5000 以内生成 100 随机数

    怎样保证在一定效率的情况下 在同一个商品中的号码只被一个用户使用呢?(要考虑并发效率)
    jininij
        4
    jininij  
       2016-10-10 18:18:38 +08:00 via Android   ❤️ 1
    1~N 的数组,打乱,在产品上架的时候就生成了。购买几个就 pop 几个
    sutra
        5
    sutra  
       2016-10-10 18:23:35 +08:00
    不能用连续的数字吗?
    liuzhen
        6
    liuzhen  
    OP
       2016-10-10 18:34:22 +08:00
    @sutra 不用连续的
    jecky15
        7
    jecky15  
       2016-10-10 18:36:53 +08:00   ❤️ 1
    10000+N 方式 切打乱生成好,买多少出多少(也需要打乱)
    liuzhen
        8
    liuzhen  
    OP
       2016-10-10 18:37:34 +08:00
    @jininij
    谢谢,明白了!

    Java 中单机的话用 Queue 的 poll()方法
    jecky15
        9
    jecky15  
       2016-10-10 18:39:23 +08:00
    5000 代表生成号码数量 一般为 10000+5000 循环生成号码在发布商品的时候切号码打乱;
    100 然后从 5000 个吗中 pop 100 个;
    sutra
        10
    sutra  
       2016-10-10 18:46:28 +08:00
    @liuzhen 我的意思是如果能用连续的数字,那么问题就方便了。不是说需要不需要连续,而是能不能。
    sutra
        11
    sutra  
       2016-10-10 18:50:08 +08:00
    比如用 redis 的 INCR 或者 INCRBY 。
    liuzhen
        12
    liuzhen  
    OP
       2016-10-10 18:57:55 +08:00
    @sutra 恩,我知道你的意思。连续的话 数据库自增 ID 最简单了
    liuzhen
        13
    liuzhen  
    OP
       2016-10-10 18:58:21 +08:00
    @sutra 不能用连续,要给用户“随机”性,哈哈
    good
        14
    good  
       2016-10-10 19:34:46 +08:00
    freeminder
        15
    freeminder  
       2016-10-11 09:37:49 +08:00
    @liuzhen 那就写一个方法将连续的数字转换为看似不连续但是有规律的数字呗,这样在数据库中还是使用的连续自增 id ,只不过用户看到的是一个转化后的结果。最后抽奖还是在连续的里面抽,公布的时候用同样的转换算法。其实底层全是自增 id 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1080 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:22 · PVG 03:22 · LAX 11:22 · JFK 14:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.