| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 | using System;using System.Security.Cryptography;using System.Text;namespace Core.Util.Common{    /// <summary>随机数</summary>    public static class Rand    {        private static readonly RandomNumberGenerator Rnd;        static Rand()        {            Rnd = new RNGCryptoServiceProvider();        }        /// <summary>返回一个小于所指定最大值的非负随机数</summary>        /// <param name="max">返回的随机数的上界(随机数不能取该上界值)</param>        /// <returns></returns>        public static int Next(int max = int.MaxValue)        {            if (max <= 0) throw new ArgumentOutOfRangeException("max");                        return Next(0, max);        }        /// <summary>返回一个指定范围内的随机数</summary>        /// <param name="min">返回的随机数的下界(随机数可取该下界值)</param>        /// <param name="max">返回的随机数的上界(随机数不能取该上界值)</param>        /// <returns></returns>        public static int Next(int min, int max)        {            if (max <= min) throw new ArgumentOutOfRangeException("max");            var buf = new byte[4];            Rnd.GetBytes(buf);            var n = BitConverter.ToInt32(buf, 0);            if (min == int.MinValue && max == int.MaxValue) return n;            if (min == 0 && max == int.MaxValue) return Math.Abs(n);            if (min == int.MinValue && max == 0) return -Math.Abs(n);            var num = max - min;            return (int)(((num * (uint)n) >> 32) + min);        }        /// <summary>返回指定长度随机字节数组</summary>        public static byte[] NextBytes(int count)        {            var buf = new byte[count];            Rnd.GetBytes(buf);            return buf;        }        /// <summary>返回指定长度随机字符串</summary>        /// <param name="length"></param>        /// <returns></returns>        public static string NextString(int length)        {            var sb = new StringBuilder();            for (int i = 0; i < length; i++)            {                var ch = (char)Next(' ', 0x7F);                sb.Append(ch);            }            return sb.ToString();        }    }}
 |