欢迎来到天天文库
浏览记录
ID:9293489
大小:21.46 KB
页数:9页
时间:2018-04-26
《快速生成百万奖券-随机数生成算法的探讨》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、快速生成百万奖券-随机数生成算法的探讨转载注明:http://www.obisoft.com.cn/zh-CN/TanZone/Details/86·2016-01-07·Mablo·技术专栏·1·36随机数生成算法,或许你觉得在实际应用中没什么好研究的。各个语言都已经高度封装了。随手一个Math.Random()就来一大把一大把的随机数。但……这样生成的随机数对于我好像并不能投入使用。实际问题是这样的:前几天写了一个微信抽奖插件,红牛公司使用了这个插件,开始大规模生成抽奖券。我的系统有一个关键模块,就是生成大量随机数,作为
2、抽奖券号。用户凭抽奖券号来领奖。唔,听上去挺简单的。我也是这么以为的。。。抽多少个奖,就调多少次Math.Random()呗~~然后随机发给用户,特定的抽奖券可以中奖,验证一下完事。做个管理端,做个用户界面,搞定~我花了大概一下午时间做完了这个系统。如果你感兴趣这个系统是怎么工作的,可以在这里访问它,它现在还在工作中:http://prizesystem.obisoft.com.cn/然后就有然后了。.。。因为我生成了10个抽奖券,它们是这样子的:743974397439743974397439743974397439743
3、97439这不是坑爹么!怪想法一这个抽奖券,必须保证一点,就是都不一样,不允许出现一模一样的两个抽奖券。(不然我抽完奖以后意外发现我还可以再抽一次!)基本上是个程序员都会笑话我。Math.Random()方法是以当前时间做种子来生成随机数的。那么,这样纸:for 100 times{ Numbers.Add(random.NextInt());}在循环里生成随机数,自然是一个很快的过程,快到时间都“没变”。怪想法二于是新手的想法就是:在这里减慢时间流逝,故意拖慢程序。。。(简直作死,这是错误示例)瞬间产生两个问题:1.
4、拖慢多久?我要拖慢程序的时间如果也是随机数的话,也是用时间做种子的呀2.程序太慢怪想法三于是新手又来了一个想法。据说新声明一个变量的地址还是比较随机的,,,那么我就用新变量的地址吧(简直作死,这是错误示例)for 100 times{ int tempi; Numbers.Add((int)&tempi/10000);}我特么真的还整出来了快速的随机数。。而且果然挺随机的呵呵。。笑笑就算了。不说这个法好不好,光对内存栈的影响就够作死了。。。而且没人告诉我这个数是随机的。。怪想法四于是我想了另一个路子……随机生成一
5、个非常非常长的巨大的随机的数,然后需要索要随机数的时候,就从这个巨大的随机的东西里面拽出来一截瞬间产生两个问题:1.巨大的随机数有多大2.太尼玛占内存了。3.每次索取完随机数,如果把巨大随机数前面去掉一截速度绝对爆卡。如果再用一个变量标记取到哪里了又太复杂果然我不得不承认,上帝是不会转骰子的。怪想法五唔,据说计算机里的随机数都是伪的,高中好像还学过什么随机数表。。果断去网上下了一个随机数表。刚搜完就后悔了。1.你怎么存这个表2.软件多次运行怎么办3.表要弄多大的怪想法六自己设计随机算法吧。我对一个Math.Random()求
6、了一个Hash,然后取最后几位,再塞进去用作种子。然后把新随机数的Hash再塞进去。问题:这好像并不随机。。。如果我的随机数只有4位,那么过一小会儿就死循环了。怪想法七如果一直从随机的角度想可能突破不了了。不妨从另一个角度想想,生成的随机数中不能有完全相同的两个随机数。好像这个也不难实现。如果要生成比较随机的数,就生成一个随机数,然后去数据库里查找他,看他是不是已经存在了,如果已经存在,就舍弃它,继续生成下一个那么,,每生成一个随机数,就要遍历一整遍数据库。这不是坑爹么!怪想法八如果不能去遍历数据库,我不妨和怪想法四结合了一
7、下,生成一个巨大的随机数,要用的时候从里面拽一截,然后遍历这个巨大的随机数,把和这一截一模一样的东西全去掉好像很美好,有两个问题每生产一个随机数,就要遍历一遍巨大的随机数。这不是坑爹么巨大的随机数不够用的时候会自动补充。补充的内容很可能含有以前出现过的值。坑爹啊怪想法九有哥们告诉我试试分组。只比较前两位,,如果不一样就跳过,一样就继续,如果还慢,试试对前两位分组,先按组查找,然后再在组里查找神马神马沙拉拉巴扎嘿。。我还在上课时间非常激动的设计了一套逆天的算法。。。回来一运行。。这不是坑爹么。。数据库快复杂死了。。调试了半天,
8、最后速度还不如原来呢。。。坑爹坑爹先这样吧我真没想到我居然会被随机数的问题难倒。。既然如此,我就先用怪想法四和怪想法七结合了一下,凑凑合合把活交工了。验收的时候,我生成了200个随机数,果然没有一个重复的。(我知道再多来点就不知道成啥样了)这个破活只给了我1500块钱。。。我也懒得研究啥厉
此文档下载收益归作者所有