生成验证码(含大小写+数字)
主要是用Random函数
之前也用,但是写这个方法的时候遇到了两个坑,记录一下:
1.new Random.Next()使用时发现一直生成一样的数,这时候可以考虑:
(1)增大两次间随机间隔 Sleep(1000), 或者delay一下
(2)或者采用时间点的种子:Random random = new Random(DateTime.Now.Millisecond);
但是测试采用DateTime.Now.Millisecond方法作为种子,产生相同数字的概率很大;甚至让线程sleep 5000,都没能解决
(3)采用guide作为种子:Random r = new Random(Guid.NewGuid().GetHashCode());
经测试,这样可以避免相同的数字产生
2.经常看到一些new Random.Next(0,99)这种的,让人感觉是生成0-99的随机数,其实呢!
new Random.Next(min,max)是一个前闭后开区间 [min,max) ,包括min不包括max!
最后附上代码:
/// <summary> /// 获取随机数(大小写英文+数字) /// </summary> /// <param name="num">位数</param> /// <returns></returns> public string GetRandomNum(int num) { var result = string.Empty; int count = 0; while (count < num) { Random r = new Random(Guid.NewGuid().GetHashCode());//采用guide作为种子,这样可以避免相同的数字产生 int random = r.Next(1, 4); if (random == 1) { result += ((char)r.Next(65, 90)).ToString();//随机大写 } else if (random == 2) { result += ((char)r.Next(97, 122)).ToString();//随机小写 } else if (random == 3) { result += r.Next(0, 9).ToString();//随机数 } count++; } return result; }
这只是俺的一个小小探索,不知道有没有更好更高效的方法生成随机数?欢迎大家留言讨论