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


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

    运行结果:

  • 相关阅读:
    如何快速给pod添加健康检查?
    如何快速下载vagrant的box?
    如何快速新建sql的demo环境?
    如何快速将某个用户添加sudo免密以及docker权限?
    七、Docker+nginx
    六、Docker+Gitlab
    五、Docker+Sqlserver
    四、Docker+Tomcat
    Docker 内程序时间设置,很重要
    三、Docker镜像的相关操作
  • 原文地址:https://www.cnblogs.com/howtrace/p/10763607.html
Copyright © 2020-2023  润新知