c#生成随机码

最近做一个项目需要用到查询码,于是顺手写了一个随机码生成类:

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对象的时候,保证传进去的种子的值是改变的,可以保持生成的随机码不重复。

 

 

转载于:https://www.cnblogs.com/yuchenghao/p/8819600.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值