通常 使用 Random 生成随机数时 , 如果连续生成随机数时间间隔较短,容易产生重复随机数 (随机种子是 Environment.TickCount 导致) 。 搜集了几种避免此类问题方案。
1.通过 GUID 做为 Random 随机种子生成。
2.通过RNGCryptoServiceProvider 直接生成 。
3.通过 RNGCryptoServiceProvider 做为 Random 随机种子生成。
示例代码如下:
private void button1_Click(object sender, EventArgs e) { //使用 guid 做为随机种子生成 Console.WriteLine("使用 guid 做为随机种子生成:" + GetRandom(8, GetRandomSeedbyGuid())); //使用 RNGCryptoServiceProvider 强类型生成 Console.WriteLine("使用 RNGCryptoServiceProvider 强类型生成:" + GetRandom(8, GetRandomSeed())); //使用 RNGCryptoServiceProvider 直接生成 范围 0 - maxValue 值 范围 Console.WriteLine("使用 RNGCryptoServiceProvider 直接生成 范围 0 - maxValue 值 范围:" + RollDice(uint.MaxValue)); } /// <summary> /// 生成小于 NumSides 的无符号随机整数 /// </summary> /// <param name="NumSides"></param> /// <returns></returns> public static uint RollDice(uint NumSides) { // Create a byte array to hold the random value. byte[] randomNumber = new byte[4]; // Create a new instance of the RNGCryptoServiceProvider. RNGCryptoServiceProvider Gen = new RNGCryptoServiceProvider(); // Fill the array with a random value. Gen.GetBytes(randomNumber); // Convert the byte to an integer value to make the modulus operation easier. uint rand = BitConverter.ToUInt32(randomNumber , 0); // Return the random number mod the number // of sides. The possible values are zero- // based, so we add one. return rand % NumSides; } /// <summary> /// 使用Guid生成种子 /// </summary> /// <returns></returns> static int GetRandomSeedbyGuid() { return new Guid().GetHashCode(); } /// <summary> /// 使用RNGCryptoServiceProvider生成种子 /// </summary> /// <returns></returns> static int GetRandomSeed() { byte[] bytes = new byte[4]; System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider(); rng.GetBytes(bytes); return BitConverter.ToInt32(bytes, 0); } /// <summary> /// 通过外界传入随机种子生成 /// </summary> static string GetRandom(int length, int Speed) { int len = length; Random random = new Random(Speed); StringBuilder strfBui = new StringBuilder(); for (int i = 0; i < len; i++) { strfBui.Append(random.Next(0, 10)); } return strfBui.ToString(); }
运行结果: