Rand.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using System;
  2. using System.Security.Cryptography;
  3. using System.Text;
  4. namespace Houdar.Core.Util.Common
  5. {
  6. /// <summary>随机数</summary>
  7. public static class Rand
  8. {
  9. private static readonly RandomNumberGenerator Rnd;
  10. static Rand()
  11. {
  12. Rnd = new RNGCryptoServiceProvider();
  13. }
  14. /// <summary>返回一个小于所指定最大值的非负随机数</summary>
  15. /// <param name="max">返回的随机数的上界(随机数不能取该上界值)</param>
  16. /// <returns></returns>
  17. public static int Next(int max = int.MaxValue)
  18. {
  19. if (max <= 0) throw new ArgumentOutOfRangeException("max");
  20. return Next(0, max);
  21. }
  22. /// <summary>返回一个指定范围内的随机数</summary>
  23. /// <param name="min">返回的随机数的下界(随机数可取该下界值)</param>
  24. /// <param name="max">返回的随机数的上界(随机数不能取该上界值)</param>
  25. /// <returns></returns>
  26. public static int Next(int min, int max)
  27. {
  28. if (max <= min) throw new ArgumentOutOfRangeException("max");
  29. var buf = new byte[4];
  30. Rnd.GetBytes(buf);
  31. var n = BitConverter.ToInt32(buf, 0);
  32. if (min == int.MinValue && max == int.MaxValue) return n;
  33. if (min == 0 && max == int.MaxValue) return Math.Abs(n);
  34. if (min == int.MinValue && max == 0) return -Math.Abs(n);
  35. var num = max - min;
  36. return (int)(((num * (uint)n) >> 32) + min);
  37. }
  38. /// <summary>返回指定长度随机字节数组</summary>
  39. public static byte[] NextBytes(int count)
  40. {
  41. var buf = new byte[count];
  42. Rnd.GetBytes(buf);
  43. return buf;
  44. }
  45. /// <summary>返回指定长度随机字符串</summary>
  46. /// <param name="length"></param>
  47. /// <returns></returns>
  48. public static string NextString(int length)
  49. {
  50. var sb = new StringBuilder();
  51. for (int i = 0; i < length; i++)
  52. {
  53. var ch = (char)Next(' ', 0x7F);
  54. sb.Append(ch);
  55. }
  56. return sb.ToString();
  57. }
  58. }
  59. }