如何更快的生成不重复随机数思路

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();
}

 

以上是关于如何更快的生成不重复随机数思路的主要内容,如果未能解决你的问题,请参考以下文章

c++中产生不重复的随机数

论 Java 中获取一组不重复的随机数之性能问题

如何让C#产生不重复的随机数

excel如何生成一定范围内不重复的随机整数?

excel如何随机生成不重复整数?

C#如何生成随机不重复的数字