避免連續生成重復隨機數筆記


 

通常 使用 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();
        }

 

運行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM