Rand.cs 2.2 KB

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