通常 使用 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(); }
運行結果: