我在一个类中使用Random来决定使用开关从三种可能的形状中绘制哪个形状。
确定形状后,我使用不同的Random实例构造一个具有一堆随机属性的形状。一切正常,但由于某种原因,为决定形状而生成的数字会以某种方式影响随机生成的绘制位置。
决定并创建形状的实例(派生自TwoDimShape,见下文):
private void btnGenerateRandShapes_Click(object sender, EventArgs e) {
for (int i = 0; i < (int)numRandShapes.Value; i++) {
Random rnd = new Random();
int tmp = rnd.Next(0, 3);
switch (tmp) {
case 0:
Circle circle = new Circle(drawArea);
circle.Draw();
break;
case 1:
Triangle triangle = new Triangle(drawArea);
triangle.Draw();
break;
case 2:
Rectangle rectangle = new Rectangle(drawArea);
rectangle.Draw();
break;
}
}
}
随机化基类中的shapes属性:
public TwoDimShape(Graphics drawArea) {
Random rand = new Random();
this.drawArea = drawArea;
startPos = new Point(rand.Next(0, MAX_X_POS), rand.Next(0, MAX_Y_POS));
height = rand.Next(0, MAX_DIM);
width = rand.Next(0, MAX_DIM);
lineWidth = rand.Next(MIN_LINE_WIDTH, MAX_LINE_WIDTH);
outlineColor = Color.FromArgb(rand.Next(0, 255), rand.Next(0, 255), rand.Next(0, 255), rand.Next(0, 255));
fillColor = Color.FromArgb(rand.Next(0, 255), rand.Next(0, 255), rand.Next(0, 255), rand.Next(0, 255));
brush = new SolidBrush(fillColor);
pen = new Pen(outlineColor, lineWidth);
}
我在图片框中绘制这些形状。由于某种原因,圆圈被绘制在图片框的左三分之一,三角形在中间的三分之一,矩形被绘制在右三分之一。
如果在开关中将形状结构放在不同的情况下,它会改变它们被吸入的第三个。
这让我相信btnGenerateShapes_Click中生成的随机数会影响TwoDimShapes构造函数中生成的数字。
为什么会发生这种情况,我该如何解决?同样,Random使用的两个实例在不同的类中,为什么一个影响另一个呢?
答案 0 :(得分:3)
您正在循环中实例化随机实例。这将导致它具有相同的种子进行多次迭代,因为默认种子是基于时间的,而不会在较低级别上进行区分。
在循环外部实例化它,并可能添加一些奇特的东西,如ThreadLocal
,以避免这种情况。