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

2016-10-10 18:00:18 +08:00
 liuzhen

前提

有 A 、 B 两种商品可以让用户认购

每认购一份则生成一个号码

不同商品产生的号码可以相同

且最终开奖也从号码中抽取

关于号码的随机生成

假定 A 商品需要认购满 5000 件才开始揭晓获奖者

那么

用户认购 100 份,就要生成 100 个号码


怎么保证在同一个商品中的号码只被一个用户使用呢?

我目前想到的方法有性能缺陷

想听一下 V 友们的意见:)
3622 次点击
所在节点    程序员
15 条回复
freeminder
2016-10-10 18:05:06 +08:00
额,认购有记录的吧,不用额外数据就行呀,记录的 id 就是抽奖号码。最后满足抽奖条件时在记录表上面 random 一下不就完了。不明白什么意思。。
liuzhen
2016-10-10 18:08:40 +08:00
@freeminder “在记录表上面 random 一下” 这句我没太看明白~
liuzhen
2016-10-10 18:13:50 +08:00
不能 append 了

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

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

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

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

Java 中单机的话用 Queue 的 poll()方法
jecky15
2016-10-10 18:39:23 +08:00
5000 代表生成号码数量 一般为 10000+5000 循环生成号码在发布商品的时候切号码打乱;
100 然后从 5000 个吗中 pop 100 个;
sutra
2016-10-10 18:46:28 +08:00
@liuzhen 我的意思是如果能用连续的数字,那么问题就方便了。不是说需要不需要连续,而是能不能。
sutra
2016-10-10 18:50:08 +08:00
比如用 redis 的 INCR 或者 INCRBY 。
liuzhen
2016-10-10 18:57:55 +08:00
@sutra 恩,我知道你的意思。连续的话 数据库自增 ID 最简单了
liuzhen
2016-10-10 18:58:21 +08:00
@sutra 不能用连续,要给用户“随机”性,哈哈
good
2016-10-10 19:34:46 +08:00
freeminder
2016-10-11 09:37:49 +08:00
@liuzhen 那就写一个方法将连续的数字转换为看似不连续但是有规律的数字呗,这样在数据库中还是使用的连续自增 id ,只不过用户看到的是一个转化后的结果。最后抽奖还是在连续的里面抽,公布的时候用同样的转换算法。其实底层全是自增 id 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/311682

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX