namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            //测试产生的验证码
            Program checking= new Program();
            for (int i = 0; i < 3; i++)
            {
               
                string str= checking.run(4);
                Console.WriteLine(asd);
            }
            Console.Read();        }
        /// <summary>
        /// 生成验证码
        /// </summary>
        /// <param name="checkingLength">产生验证码的长度</param>
        /// <returns>最后生成的验证码</returns>
        public string run(int checkingLength )
        {
            //出现的随机数
            string str = "1,2,3,4,5,6,7,8,9,0,A,a,B,b,C,c,D,d,E,e,F,f,G,g,H,h,I,i,J,j,K,k,L,l,M,m,N,n,O,o,P,p,Q,q,R,r,S,s,T,t,U,u,V,v,W,w,X,x,Y,y,Z,z";
            //最后返回的验证码
            string checkng = "";
            Random ran = new Random();
            //接收随机码的数组
            string[] stringArry = str.Split(',');
            //随机数组的下标值
            int amout = 0;
            
            for (int i = 0; i < checkingLength; i++)
            {
                //产生验证码数组的下标
               int num = ran.Next(62);
                //判断数组下标是否相同
               if (num == amout)
               {
                   //下标值改变
                   amout += i;
                   //果如改变的下标值超过数组索引界限
                   if (amout > stringArry.Length)
                       //将其数组下标缩小
                       amout = amout - (num / 2);
               }
               else
               {
                   amout = num;
               }
                //拼接产生的验证码
                checkng += stringArry[amout];
            }
            return checkng;
        }
    }
}这是我写的一个简单的验证码产生的算法,我想测试下产生的数据。结果显示的都一样,但是我打上断点输出的内容却不一样?很迷糊额,难道我这样测试不对嘛

解决方案 »

  1.   

    Console.WriteLine(asd);
    asd是个毛啊?
      

  2.   

    string str= checking.run(4);
    刚测试了下,每次str的值不同啊!
      

  3.   

    调试结论:你电脑太好了;
    修改如下:
                    string str =checking. run(4);
                    Thread.Sleep(50);                Console.WriteLine(str);
      

  4.   


     class Program
        {
            static void Main(string[] args)
            {
                //测试产生的验证码
                Program checking = new Program();
                for (int i = 0; i < 3; i++)
                {                string str = checking.run(4);
                    Console.WriteLine(str);
                }
                Console.Read();        }
            /// <summary>
            /// 生成验证码
            /// </summary>
            /// <param name="checkingLength">产生验证码的长度</param>
            /// <returns>最后生成的验证码</returns>
            public string run(int checkingLength )
            {
                //出现的随机数
                string str = "1,2,3,4,5,6,7,8,9,0,A,a,B,b,C,c,D,d,E,e,F,f,G,g,H,h,I,i,J,j,K,k,L,l,M,m,N,n,O,o,P,p,Q,q,R,r,S,s,T,t,U,u,V,v,W,w,X,x,Y,y,Z,z";
                //最后返回的验证码
                string checkng = "";
                Random ran = new Random();
                //接收随机码的数组
                string[] stringArry = str.Split(',');
                //随机数组的下标值
                int amout = 0;
                
                for (int i = 0; i < checkingLength; i++)
                {
                    //产生验证码数组的下标
                   int num = ran.Next(62);
                    //判断数组下标是否相同
                   if (num == amout)
                   {
                       //下标值改变
                       amout += i;
                       //果如改变的下标值超过数组索引界限
                       if (amout > stringArry.Length)
                           //将其数组下标缩小
                           amout = amout - (num / 2);
                   }
                   else
                   {
                       amout = num;
                   }
                    //拼接产生的验证码
                    checkng += stringArry[amout];
                }
                return checkng;
            }
        }
      

  5.   

    随即数是以为种子的,如果运行太快,时间种子酒没变,产生相同的随即数.
    添加这个命名空间using System.Threading;
    然后在加上我标注颜色的一句;
      

  6.   

     最后的结果是我电脑的运行太快了,没有给random 分配值额
     让主线程挂起 确实结局了问题额
     
      

  7.   

          public string run(int checkingLength)
            {            string str =                     "1,2,3,4,5,6,7,8,9,0,A,a,B,b,C,c,D,d,E,e,F,f,G,g,H,h,I,i,J,j,K,k,L,l,M,m,N,n,O,o,P,p,Q,q,R,r,S,s,T,t,U,u,V,v,W,w,X,x,Y,y,Z,z";
                string checkng = "";
                var sl = str.Split(',').ToList<string>().OrderBy(s => Guid.NewGuid()).Take(checkingLength).ToList<string>();            foreach (var s in sl)
                    checkng += s;
                return checkng;
            }