關於C#中隨機數的生成問題


默認情況下,C#中的偽隨機數生成器Random是根據系統時間來設置其種子的。若我們采用默認的方式,對Random進行初始化的時候不賦予任何參數,其隨機種子便采用系統時間。如果我們用循環一次生成多個隨機數,由於CPU運算速度太快了,所以每次取到的都是同一個時間,即生成的隨機數都會一樣,因此每次生成隨機數之前需要更換隨機數種子。

對於這種情況,我們可以采用加密隨機數生成器來生成不同的種子,每次需要生成隨機數的時候為Random賦予不同的種子,即使在很短的時間內也可以保證生成的隨機數不同。具體代碼如下:

        /// <summary>
        /// 加密隨機數生成器,生成隨機種子
        /// </summary>
        /// <returns></returns>
        private static int Chaos_GetRandomSeed()
        {
            byte[] bytes = new byte[4];
            System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
            rng.GetBytes(bytes);
            return BitConverter.ToInt32(bytes, 0);
        }

 生成隨機數的時候,每次將生成的隨機數種子作為參數初始化Random即可,代碼如下:

            //用消息框輸出十個隨機數
            string strMSG = "";            
            for (int i = 0; i < 10; i++)
            {
                //每次生成隨機數的時候都使用機密隨機數生成器來生成種子,
                //這樣即使在很短的時間內也可以保證生成的隨機數不同
                Random rdm = new Random(Chaos_GetRandomSeed());

                //獲取一個10到30之間的隨機數
                int iRand = rdm.Next(10, 300);
                strMSG += iRand.ToString() + " ";                
            }
            MessageBox.Show(strMSG,"隨機數測試");

 程序最終運行截圖如下:


免責聲明!

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



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