12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- using System;
- using System.Security.Cryptography;
- using System.Text;
- namespace Houdar.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();
- }
- }
- }
|