首页 > 技术文章 > 使用RandomString方法后,结果返回相同的随机数解决办法

beimingdaoren 2020-03-12 20:04 原文

所遇问题:

在做超市管理系统的登录项目时,在对“随机数的产生”出现一个问题,在产生多个随机数的时候,出现了产生了多个一样的随机数,具体代码如下:

   
     /// <summary>
        /// 生成随机字符串
        /// </summary>
        /// <param name="length">字符串的长度</param>
        /// <returns></returns>
        public string RandomString(int length)
        {
            // 创建一个StringBuilder对象存储返回的验证码
            StringBuilder sb = new StringBuilder();
//使用for循环把单个字符填充进StringBuilder对象里面变成自定义长度的字符串 for (int i = 0; i < length; i++) { Random random = new Random(); //随机选择里面其中的一种字符生成 switch (random.Next(0,3)) { case 0: //调用生成生成随机数字的方法 sb.Append(Num()); break; case 1: //调用生成生成随机小写字母的方法 sb.Append(Small()); break; case 2: //调用生成生成随机大写字母的方法 sb.Append(Big()); break; } } return sb.ToString(); }

 


调用的方法:

     /// <summary>
        /// 生成单个随机数字
        /// </summary>
        private int Num()
        {
            Random random = new Random();
            int num = random.Next(0,10);
            return num;
        }

        /// <summary>
        /// 生成单个大写随机字母
        /// </summary>
        private string Big()
        {
            //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>
        private string Small()
        {
            //a-z的 ASCII值为97-122
            Random random = new Random();
            int num = random.Next(97, 123);
            string abc = Convert.ToChar(num).ToString();
            return abc;
        }

使用RandomString方法后,结果返回了相同的随机数,经过找资料后,给出的解释:

创建随机数的一个实例,并在每次需要随机数时使用它。通常,如果你有多个随机数实例,并通过代码在同一迭代中调用它们,那么最终将从每个实例中获得相同的数字。

 

解决办法:

使用Random时加上System.Guid.NewGuid().GetHashCode(),即:Random random = new Random(System.Guid.NewGuid().GetHashCode()); 具体代码如下:

     /// <summary>
        /// 生成单个随机数字
        /// </summary>
        private int Num()
        {
            Random random = new Random(System.Guid.NewGuid().GetHashCode());
            int num = random.Next(0,10);
            return num;
        }

        /// <summary>
        /// 生成单个大写随机字母
        /// </summary>
        private string Big()
        {
            //A-Z的 ASCII值为65-90
            Random random = new Random(System.Guid.NewGuid().GetHashCode());
            int num = random.Next(65, 91);
            string abc = Convert.ToChar(num).ToString();
            return abc;
        }

        /// <summary>
        /// 生成单个小写随机字母
        /// </summary>
        private string Small()
        {
            //a-z的 ASCII值为97-122
            Random random = new Random(System.Guid.NewGuid().GetHashCode());
            int num = random.Next(97, 123);
            string abc = Convert.ToChar(num).ToString();
            return abc;
        }

推荐阅读