class T
    {
        private double[] d = new double[3];        public double[] D
        {
            get { return d; }
            set { d = value; }
        }    }
        static void Main(string[] args)
        {
            T t = new T();
            for (int i = 0; i < t.D.Length; i++)
            {
                t.D[i] = new Random().NextDouble();
            }
            for (int i = 0; i < t.D.Length; i++)
            {
                Console.WriteLine(t.D[i]);
            }
                Console.ReadLine();
        }
这个程序为什么我debug执行D中会有三个不同的值,直接执行D中的三个值却每次都是相同的呢

解决方案 »

  1.   

    答案:http://msdn.microsoft.com/zh-cn/library/system.random.aspx
      

  2.   

    是的。new Random是使用当前的时钟来作为种子的。你的代码可以改一下:  T t = new T();
      Random Rnd = new Random(); 
      for (int i = 0; i < t.D.Length; i++)
      {
      t.D[i] = Rnd.NextDouble();
      }
      for (int i = 0; i < t.D.Length; i++)
      {
      Console.WriteLine(t.D[i]);
      }或者你把Rnd定义为static的更方便。
      

  3.   

    因为两次取随机数的时间间隔太小了,所以取到的是相同值:
    Response.Write(new Random().NextDouble());
    for (int i = 0; i < 10000000; i++)
    ;
    Response.Write("<br/>" + new Random().NextDouble());
    如上面的代码,如果中间的for循环执行次数少一个0,就会出现相同的结果。
      

  4.   

    默认种子值是从系统时钟派生而来的,具有有限的分辨率。因此,通过调用默认构造函数而频繁创建的不同 Random 对象将具有相同的默认种子值,因而会产生几组相同的随机数。 使用单个 Random 对象生成所有随机数可以避免此问题。 
    这个是MSDN文档里对Random的一段描述,所以你所说的怪异现象是完整正常的,如果你要保证产生不同的数,代码应该这样写:
    static void Main(string[] args)
      {
      T t = new T();
      Random rd = new Random();
      for (int i = 0; i < t.D.Length; i++)
      {
      t.D[i] = rd.NextDouble();
      }
      for (int i = 0; i < t.D.Length; i++)
      {
      Console.WriteLine(t.D[i]);
      }
      Console.ReadLine();
      }
      

  5.   

    记得以前 Basic 中还有 Randomize 可以用,C# 不知道怎么弄啊。