再谈非重复随机序列号生成算法

这段时间项目中又要开发兑换码功能,此前的项目已经开发过,但是为了保证这个功能在将来的可重复利用,我决定重构一下相关模块。

原来的模块不是我开发的,但也已经可以完成这个要求。但其中存在两个问题,这也是基本上非重复随机序列生成算法都要面对的问题
(1)是非重复性
(2)是效率

我们原来的程序员开发的,是使用的最低效的方式,即随机生成后,遍历已经生成的所有随机序列号,如果重复则放弃这组随机序列号,重新生成。在这个过程中,首先暴露的是低效,其次是只能保证本批次的序列号不重复,再次启动工具生成,两个批次的随机序列号就无法保证不重复了。

那么也会有人问,为什么不使用GUID之类的算法,因为兑换码这个东西,其实有很多额外的需求,比如长度,随机码中使用的字符,有纯数字的序列号,也有纯字母的,所以诸如GUID,MD5,SHA等都不完全适合。

我前几天曾经转了一篇非重复随机序列生成算法 ,其中作者的思路确实提供我很大的帮助,但是仔细看了作者的实现后,其实也发现了一点欠缺,该文中的算法解决了效率问题,也解决了重复问题,但是其能生成的序列号数量大大减少。打个比方,如果是生成长度10的序列号,文中的算法将保证[0~9]的数组只出现一次,按照排列组合的算法,最终出现的序列号总数是10*9*7*6*5*4*3*2*1,但实际我们需求的序列号,每一位的数字可以重复,但整个序列号不能产生重复,换句话说,我们的序列号总数应该是10的10次幂。

改进方案

(一)对于一个非重复的随机序列号,要做到非重复,其N位上出现的字符的顺序不能有相同的情况。使用排列组合的知识我们知道,假设我们有N位,每一位上允许的字符有m个的话,我们能产生的不重复的排列组合总量为m1 m2 * m3 …*mN个,这就是非重复性
(二)随机性,也就是我们从上述m的N次幂的序列中,随机抽取K个,就能完成我们的目标。当然,不能用随机数来决定抽取哪一个,这样还得遍历已经抽取出来的序列号

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值