比较怪异的现象
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中的三个值却每次都是相同的呢 --------------------编程问答-------------------- 可能是随机种子的问题。。。
时间间隔太短导致的。。。
--------------------编程问答-------------------- 答案:
http://msdn.microsoft.com/zh-cn/library/system.random.aspx --------------------编程问答-------------------- 是的。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的更方便。 --------------------编程问答-------------------- sp1234“出关”了?
呵呵,好久不见了! --------------------编程问答-------------------- 因为两次取随机数的时间间隔太小了,所以取到的是相同值:
Response.Write(new Random().NextDouble());
for (int i = 0; i < 10000000; i++)
;
Response.Write("<br/>" + new Random().NextDouble());
如上面的代码,如果中间的for循环执行次数少一个0,就会出现相同的结果。 --------------------编程问答-------------------- 默认种子值是从系统时钟派生而来的,具有有限的分辨率。因此,通过调用默认构造函数而频繁创建的不同 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();
}
--------------------编程问答-------------------- 记得以前 Basic 中还有 Randomize 可以用,C# 不知道怎么弄啊。
补充:.NET技术 , C#