如何更快的生成不重复随机数思路
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何更快的生成不重复随机数思路相关的知识,希望对你有一定的参考价值。
最新接到一个需求,由于运营需要我们需要在原用户的信息上加入一个邀请码用于推广。
略为思考一下,我们可以将需要拆分为一下几点:
1、邀请码为数字和字母组成6位的随机数
2、随机数不能重复
3、将数据与用户关联,插入数据库
--------------------------------------------------------------------
解决思路:
生成随机数不表,大家应该都会
不重复如何解决呢,有同学想到先到数据库中做一次查询,如果没有该随机数再进行插入,如果有重新生成,做一个递归就好了。
public string CreateCouponCode()
{
string couponCode = Utility.GetRandomStrings(5);
//判断是否存在该邀请码
var flag = Database.Users.Any(p => p.CouponCode == couponCode);
if (flag)
{
couponCode = CreateCouponCode();
}
return couponCode;
}
在用户比较少的情况下,大家等一下也无所谓,不过我们有几万用户甚至更多的时候,那这个执行时间就比较久了。因为没更新一条数据都至少有一次连接。
稍微思考一下,换个思路,因为我们是第一次加入数据,所有我们去重的操作不需要放到数据库中,我们先生成几万不重复的随机数,然后依次往数据库中提交即可,这样速度就快N倍了。
public void UpdateUserCouponCode()
{
var date = Db.Users.ToList();
List<string> codelist = new List<string>();
//生成不重复的邀请码
while (codelist.Count <= date.Count)
{
string couponCode = Utility.GetRandomStrings(5);
if (!codelist.Contains(couponCode))
{
codelist.Add(couponCode);
}
}
// 循环更新用户
for (int i = 0; i < date.Count; i++)
{
var item = date[i];
item.CouponCode = codelist[i];
item.LastUpdateTime = DateTime.Now;
SetUpdateProperty(item, "CouponCode");
//每100条数据提交一次数据库
if (i > 0 && i % 100 == 0)
{
Db.SaveChanges();
}
}
Db.SaveChanges();
}
以上是关于如何更快的生成不重复随机数思路的主要内容,如果未能解决你的问题,请参考以下文章