最近做一个项目需要用到查询码,于是顺手写了一个随机码生成类:
public class RandomPW { /// <summary> /// 生成单个随机数字 /// </summary> public int CreateNum() { Random random = new Random((); int num = random.Next(10); return num; } /// <summary> /// 生成单个大写随机字母 /// </summary> public string CreateBigAbc() { //A-Z的 ASCII值为65-90 Random random = new Random(); int num = random.Next(65, 91); string abc = Convert.ToChar(num).ToString(); return abc; } /// <summary> /// 生成单个小写随机字母 /// </summary> public string CreateSmallAbc() { //a-z的 ASCII值为97-122 Random random = new Random(); int num = random.Next(97, 123); string abc = Convert.ToChar(num).ToString(); return abc; } /// <summary> /// 生成随机数 /// </summary> /// <returns></returns> public string GetRandomPW(int len) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < len; i++) { Random random = new Random(); switch (random.Next(3)) { case 0: sb.Append(CreateNum()); break; case 1: sb.Append(CreateSmallAbc()); break; case 2: sb.Append(CreateBigAbc()); break; } } var nowdata = DateTime.Now.ToString("yyyymmdd"); var result = nowdata + sb.ToString(); return result; } }
但是使用之后发现生成的随机码都是一样的类似于:201813137777777777、20180613XXXXXXXXXX这类的随机码,可以看出,后面的随机码完全一样,于是我查看了一下random类的定义,发现random有两个构造方法,一个带参一个不带参,
// // 摘要: // 新实例初始化 System.Random 类,使用依赖于时间的默认种子值。 public Random(); // // 摘要: // 新实例初始化 System.Random 类,使用指定的种子值。 // // 参数: // Seed: // 用来计算伪随机数序列起始值的数字。 如果指定的是负数,则使用其绝对值。 public Random(int Seed);
想了一下,会不会是这个种子我没有设置,导致随机数的起始值一直是一样的呢,于是我修改代码为:
public class RandomPW { /// <summary> /// 生成单个随机数字 /// </summary> public int CreateNum(int i) { Random random = new Random((int)DateTime.Now.Ticks+i); int num = random.Next(10); return num; } /// <summary> /// 生成单个大写随机字母 /// </summary> public string CreateBigAbc(int i) { //A-Z的 ASCII值为65-90 Random random = new Random((int)DateTime.Now.Ticks+i); int num = random.Next(65, 91); string abc = Convert.ToChar(num).ToString(); return abc; } /// <summary> /// 生成单个小写随机字母 /// </summary> public string CreateSmallAbc(int i) { //a-z的 ASCII值为97-122 Random random = new Random((int)DateTime.Now.Ticks+i); int num = random.Next(97, 123); string abc = Convert.ToChar(num).ToString(); return abc; } /// <summary> /// 生成随机数 /// </summary> /// <returns></returns> public string GetRandomPW(int len) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < len; i++) { Random random = new Random((int)DateTime.Now.Ticks+i); switch (random.Next(3)) { case 0: sb.Append(CreateNum(i)); break; case 1: sb.Append(CreateSmallAbc(i)); break; case 2: sb.Append(CreateBigAbc(i)); break; } } var nowdata = DateTime.Now.ToString("yyyymmdd"); var result = nowdata + sb.ToString(); return result; } }
可以看到,在每次声明Random对象的时候,保证传进去的种子的值是改变的,可以保持生成的随机码不重复。