我在我的一堂课上发现了一种奇怪的行为。如果我调试程序,它将按预期的方式工作--它返回数组,其中随机长度填充了来自"string [] basicJobs“的随机字符串元素,该字符串作为类构造函数中的一个参数传递。如果我按下F5开始程序,就会出现奇怪的行为。在这种情况下,CreateWork()返回一个具有随机长度但充满相同字符串的数组。
class WorkCreator
{
private string[] basicJobs;
private string[] createdJobs;
private Random randWorkCount = new Random();
public WorkCreator(string[] basicJobs)
{
this.basicJobs = basicJobs;
}
public string[] CreateWork()
{
Random randomBasicJob = new Random();
this.createdJobs = new string[randWorkCount.Next(3, 20)];
for (int i = 0; i < this.createdJobs.Length; i++)
{
// createdJobs[i] = this.basicJobs[randomBasicJob.Next(basicJobs.Length)];
createdJobs[i] = this.basicJobs[Convert.ToInt16(new Random().Next(this.basicJobs.Length))];
}
return createdJobs;
}
}
我找到了一个解决方案( CreateWork()
中的代码注释行),但我仍然想知道这些行为的原因是什么. :(。我正在使用Visual Studio Community 2013
和.Net 4.5
。
谢谢你提前帮忙。
发布于 2015-04-03 11:28:44
在System.Random文档 (第一段)中,它的内容如下:
默认的种子值是从系统时钟导出的,并且具有有限的分辨率。因此,通过调用默认构造函数而连续创建的不同随机对象将具有相同的缺省种子值,因此将产生相同的随机数集。通过使用单个随机对象生成所有随机数,可以避免这个问题。您还可以修改系统时钟返回的种子值,然后显式地将这个新的种子值提供给随机(Int32)构造函数。有关更多信息,请参见随机(Int32)构造函数。
这可能是对代码中正在发生的事情的最好解释。
如果您单步执行您的程序,则会有更多的时间流逝,种子也会不同,因此您获得的字符串也会不同。如果您只是运行程序,种子是完全相同的,因为行被执行没有太多的延迟。
https://stackoverflow.com/questions/29431165
复制相似问题