随机数

using System;
using System.Text;
using System.Collections.Generic;
using System.Security.Cryptography;

namespace Utils
{
    public class Rnd
    {
        [Flags]
        public enum CharType
        {
            None = 0,
            Numbers = 1,
            LowerLetter = 2,
            UpperLetter = 4,
            Symbol = 8,
            Chinese = 16
        }

        public Rnd(int count, CharType type)
        {
            _count = count;
            _type = type;
        }
        protected int _count;
        protected CharType _type;

        public int Count
        {
            get { return _count; }
        }
        public CharType Type
        {
            get { return _type; }
        }
        public string NextChars()
        {
            return Rnd.GetChars(Count, Type);
        }
        protected char NextChar()
        {
            return Rnd.GetChar(Type);
        }


        #region Static Members

        private static byte[] randb = new byte[4];

        private static RNGCryptoServiceProvider rand = new RNGCryptoServiceProvider();

        private static char[] SYMBOLS = new char[] {                            
            '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', 
            '+', '|', '\\', '=', '-', ',', '.', '/', ';', '\'', '[', ']', 
            '<', '>', '?', ':', '"', '{', '}' 
        };
        private static char[] BASE = new char[16] {                             
            '0', '1', '2', '3', '4', '5', '6', '7',
            '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' 
        };
        private static Encoding gb = Encoding.GetEncoding("gb2312");            



        public static char GetChar(CharType type)
        {
            return GetChar2(GetCharTypes(type));
        }

        public static string GetChars(int count, CharType type)
        {
            CharType[] a = GetCharTypes(type);
            if (a.Length > 0)
            {
                StringBuilder chars = new StringBuilder();
                char c;
                for (int i = 0; i < count; )
                {
                    c = GetChar2(a);
                    if (c != '\0')
                    {
                        chars.Append(c);
                        i++;
                    }
                }
                return chars.ToString();
            }
            else
            {
                return string.Empty;
            }
        }

        static CharType[] GetCharTypes(CharType type)
        {
            List<CharType> a = new List<CharType>();
            int b = (int)type;
            foreach (int c in Enum.GetValues(typeof(CharType)))
            {
                int e = c & b;
                if (e != 0)
                {
                    a.Add((CharType)e);
                }
            }
            CharType[] d = new CharType[a.Count];
            a.CopyTo(d);
            return d;
        }

        static char GetChar2(CharType[] type)
        {
            CharType a = type[Next(0, type.Length)];
            switch (a)
            {
                case CharType.Numbers:
                    return GetNumber();
                case CharType.LowerLetter:
                    return GetLowerLetter();
                case CharType.UpperLetter:
                    return GetUpperLetter();
                case CharType.Symbol:
                    return GetSymbol();
                case CharType.Chinese:
                    return GetChinese();
                default:
                    return '\0';
            }
        }

        public static char GetNumber()
        {
            return (char)Next((int)'0', (int)'9');
        }

        public static char GetLowerLetter()
        {
            return (char)Next((int)'a', (int)'z');
        }

        public static char GetUpperLetter()
        {
            return (char)Next((int)'A', (int)'Z');
        }

        public static char GetSymbol()
        {
            return SYMBOLS[Next(0, SYMBOLS.Length)];
        }

        public static char GetChinese()
        {
            string b1, b2;
            int i;
            i = Next(11, 14);

            b1 = BASE[i].ToString();

            if (i == 13)
                b1 += BASE[Next(0, 7)];
            else
                b1 += BASE[Next(0, 16)];

            i = Next(10, 16);
            b2 = BASE[i].ToString();

            if (i == 10)
                b2 += BASE[Next(1, 16)].ToString();
            else if (i == 15)
                b2 += BASE[Next(0, 15)].ToString();
            else
                b2 += BASE[Next(0, 16)].ToString();
            byte[] b = new byte[2];
            b[0] = Convert.ToByte(b1, 16);
            b[1] = Convert.ToByte(b2, 16);
            char[] chars = gb.GetString(b).ToCharArray();
            return chars[0];
        }

        public static int Next()
        {
            rand.GetBytes(randb);
            int value = BitConverter.ToInt32(randb, 0);
            if (value < 0) value = -value;
            return value;
        }

        public static int Next(int max)
        {
            rand.GetBytes(randb);
            int value = BitConverter.ToInt32(randb, 0);
            value = value % max;
            if (value < 0) value = -value;
            return value;
        }

        public static int Next(int min, int max)
        {
            int value = Next(max - min) + min;
            return value;
        }

        #endregion

    }
}

 

posted @ 2013-01-25 15:29  beikx  阅读(154)  评论(0编辑  收藏  举报