using System.Security.Cryptography;
using System.Text;
namespace PlcSiemens.Core.Common
{
    /// 随机数
    public static class Rand
    {
        private static readonly RandomNumberGenerator Rnd;
        static Rand()
        {
            Rnd = new RNGCryptoServiceProvider();
        }
        /// 返回一个小于所指定最大值的非负随机数
        /// 返回的随机数的上界(随机数不能取该上界值)
        /// 
        public static int Next(int max = int.MaxValue)
        {
            if (max <= 0) throw new ArgumentOutOfRangeException("max");
            return Next(0, max);
        }
        /// 返回一个指定范围内的随机数
        /// 返回的随机数的下界(随机数可取该下界值)
        /// 返回的随机数的上界(随机数不能取该上界值)
        /// 
        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);
        }
        /// 返回指定长度随机字节数组
        public static byte[] NextBytes(int count)
        {
            var buf = new byte[count];
            Rnd.GetBytes(buf);
            return buf;
        }
        /// 返回指定长度随机字符串
        /// 
        /// 
        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();
        }
    }
}