zoukankan      html  css  js  c++  java
  • Random产生随机数问题

      昨天在开发时发现这个问题,在同一个for循环内,通过Random多次产生随机数得到的随机数竟是一样的!以前还真没发现这个问题。

      以下是简化的代码,如果将random定义在for循环外面则不会有问题(猜测Random与时间有关且存在固定的算法获取随机数),但实际开发中一般会把产生随机数封装为一个方法,调用的时候情况就与下面的一样了。

                StringBuilder builder = new StringBuilder();
                for (int i = 0; i < 200; i++)
                {
                    Random random = new Random();
                    builder.Append(random.Next(1000, 9999));
                    builder.Append("<br/>");
                }
                Response.Write(builder.ToString());
    

      解决方案都是从随机种子下手,一般见到有下面两种:

                StringBuilder builder = new StringBuilder();
                for (int i = 0; i < 200; i++)
                {
                    Random random = new Random(GetRandomSeed());
                    builder.Append(random.Next(1000, 9999));
                    builder.Append("<br/>");
                }
                Response.Write(builder.ToString());
    
                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);
                }
    

       

                StringBuilder builder = new StringBuilder();
                for (int i = 0; i < 200; i++)
                {
                    Random random = new Random(Guid.NewGuid().GetHashCode());
                    builder.Append(random.Next(1000, 9999));
                    builder.Append("<br/>");
                }
                Response.Write(builder.ToString());
    

      通过Stopwatch测试,这两种方法的速度几乎没有区别,与不使用随机种子的方式在时间消耗上也没有差别,可以放心的使用,第二种更简捷!

  • 相关阅读:
    2018.5.22 Oracle安装配置在虚拟机中外部电脑连接服务
    2018.5.20 oracle强化练习
    2018.5.19 Oracle数据操作和管理表的综合练习
    2018.5.18 AndroidStudio创建项目出错
    2018.5.17 oracle函数查询
    2018.5.14 XML文档类型定义----DTD
    2018.5.13 oracle遇到的问题
    二元搜索算法(分治法)
    循环队列(弥补队列顺序储存的不足)
    队列的顺序储存
  • 原文地址:https://www.cnblogs.com/hnlong1/p/4818979.html
Copyright © 2011-2022 走看看