我有以下代码生成随机数,以便在条形图上绘制。但是,只有在特定行上设置了断点时,它才能正常工作,否则,所有10个新数据点都会以完全相同的数字出现。
case 3:
//Add ten data sets to go through all default colors
DatasetPairing<BarPresentation, BarGraphDataset<GraphableDouble>> datasetPairing;
foreach (HorizontalBarPlotter<GraphableDouble, GraphableDouble> graphPlotter in this.Data.GraphPlots)
{
for (int i = 1; i <= 11; i++)
{
datasetPairing = new DatasetPairing<BarPresentation, BarGraphDataset<GraphableDouble>>();
datasetPairing.DatasetPresentation = new BarPresentation();
datasetPairing.GraphableDataset = GetOneDataset(0, false);
graphPlotter.DatasetMap.Add(datasetPairing); //breakpoint set here
}
List<IAxis> xAxes;
xAxes = new List<IAxis>();
xAxes.Add(graphPlotter.DetermineXAxis());
this.Data.BottomAxes = xAxes;
this.Data.TopAxes = xAxes;
}
NextStep = "Return to a single dataset and add comment to values for tooltips";
break;
我不知道为什么会这样,我之前从未听说过这样的问题......也许这是视觉工作室的一个错误?任何帮助将不胜感激
答案 0 :(得分:6)
没有真正的随机数,你只有伪随机数。随机数的创建基于通常是当前时间的种子。
如果您每次想要一个新的随机数时创建一个新对象,它将是相同的数字,因为时间没有改变。 (记得当你运行应用程序时,一切都在不到一毫秒的时间内发生 - 当你调试应用程序时,在创建2个新的随机变量之间有一段时间,因此随机数是不同的)
您应该使用一个对象来创建所有随机数,并使用Random.Next()来获取新的随机值。
如果您查看Random类的documentation,您将看到以下行:
由a紧密连续创建的不同随机对象 对默认构造函数的调用将具有相同的默认种子 值
解决方案是:
使用单个Random对象生成所有随机数可以避免此问题。您还可以通过修改系统时钟返回的种子值,然后将此新种子值显式提供给Random(Int32)构造函数来解决此问题。
答案 1 :(得分:0)
我怀疑您用来创建随机点的方法使用Random.Next()
。如果快速连续调用它,它可以返回相同的值。使用Thread.Sleep()
添加延迟可能是值得的。
答案 2 :(得分:0)
如果您正在使用Random类,请确保每次都不创建新对象。
来自msdn的:
using the parameterless constructor to create different Random objects in close succession creates random number generators that produce identical sequences of random numbers. This problem can be avoided by creating a single Random object rather than multiple ones.
我通常会创建一个单独的静态随机对象,并且总是将其用于随机数,这样就不会有重复项