问一个一元夺宝号码生成问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容 #Wrapper { background-color: #e2e2e2; background-image: url("/static/img/shadow_light.png"), url("//cdn.v2ex.com/assets/bgs/circuit.png"); background-repeat: repeat-x, repeat-x; } #Wrapper.Night { background-color: #1f2e3d; background-image: url("/static/img/shadow.png"), url("//cdn.v2ex.com/assets/bgs/circuit_night.png"); background-repeat: repeat-x, repeat-x; background-size: 20px 20px, 162.5px 162.5px; }
liuzhen
V2EX    程序员

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

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

    前提

    有 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
    使用 redis t/290293
    freeminder
        15
    freeminder  
       2016-10-11 09:37:49 +08:00
    @liuzhen 那就写一个方法将连续的数字转换为看似不连续但是有规律的数字呗,这样在数据库中还是使用的连续自增 id ,只不过用户看到的是一个转化后的结果。最后抽奖还是在连续的里面抽,公布的时候用同样的转换算法。其实底层全是自增 id 。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5431 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 08:46 PVG 16:46 LAX 01:46 JFK 04:46
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86