避免连续生成重复随机数笔记

 

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

 

运行结果:

 

posted on 2019-04-24 17:23  千浔  阅读(1500)  评论(0编辑  收藏  举报