生成验证码(含大小写+数字)

主要是用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;
        }

 

这只是俺的一个小小探索,不知道有没有更好更高效的方法生成随机数?欢迎大家留言讨论

posted @ 2018-06-07 16:29  AdolphChen  阅读(784)  评论(0编辑  收藏  举报