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

2016-04-11 11:23:27 +08:00
 ck1llc
之前提到过帮朋友做个东西 http://www.v2ex.com/t/269177 ,虽然我拒绝了,但是他有个随机生成算法问题问我。

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

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

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

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

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


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

比如炉石传说的手牌,其实在换牌的一瞬间,所有牌的排序就固定了(除非用了影响牌堆的牌,比如挖宝之类)
ck1llc
2016-04-11 14:05:15 +08:00
@hitmanx @9hills 感谢支持,那我就让他这么搞了
zonghua
2016-04-11 14:07:53 +08:00
随机生成下标,然后用下标取数组的元素
ykrl089
2016-04-11 14:21:12 +08:00
我觉得都放内存好了, 就算是一百万号码,在内存中也不过几个 mb 而已。
ck1llc
2016-04-11 14:36:58 +08:00
@ykrl089 活动不止一个呢,如果有几百个活动同时在进行呢
tabris17
2016-04-11 14:50:36 +08:00
你说的是洗牌算法, shuffle
gimp
2016-04-11 15:01:17 +08:00
@ck1llc 那就加内存 :doge:
hst001
2016-04-11 15:04:14 +08:00
先生成号码按队列取下去就好了,反正要的是随机
cc7756789
2016-04-11 15:14:50 +08:00
分 100 组,每组 100 个号码, 0-99 、 100-199 、 200-299 。。。。。前 100 个人来抽奖,随机分配。至于奖项,随机分配给每一组的某个号码。不过还是直接打乱来得轻松。
cevincheung
2016-04-11 15:27:25 +08:00
redis spop
zado
2016-04-11 15:40:10 +08:00
还是方内存简单,如果几百个活动同时进行也不太可能挤在一个服务器上。

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

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

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

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

© 2021 V2EX