C# 如何重置或';清洁';随机的

C# 如何重置或';清洁';随机的,c#,random,drawing,C#,Random,Drawing,我在一节课上用一个随机数,从三个可能的形状中,用一个开关来决定要画哪个形状 确定形状后,我使用不同的随机实例构造一个具有一系列随机属性的形状。一切正常,除了出于某种原因,决定形状所生成的数字会以某种方式影响随机生成的绘制位置 确定并创建形状的实例(源自TwoDimShape,请参见下文): 我在一个画框里画这些形状。由于某些原因,圆圈画在图片框的左第三、中间第三的三角形和右边第三的矩形上。 如果将形状构造放在开关中的另一个案例中,则会更改绘制它们的第三个案例 这让我相信在btnGenerateS

我在一节课上用一个随机数,从三个可能的形状中,用一个开关来决定要画哪个形状

确定形状后,我使用不同的随机实例构造一个具有一系列随机属性的形状。一切正常,除了出于某种原因,决定形状所生成的数字会以某种方式影响随机生成的绘制位置

确定并创建形状的实例(源自TwoDimShape,请参见下文):

我在一个画框里画这些形状。由于某些原因,圆圈画在图片框的左第三、中间第三的三角形和右边第三的矩形上。

如果将形状构造放在开关中的另一个案例中,则会更改绘制它们的第三个案例

这让我相信在btnGenerateShapes_Click中生成的随机数会影响TwoDimShapes构造函数中生成的数


为什么会发生这种情况,我该如何解决?同样,使用的两个随机实例在不同的类中,那么为什么一个会影响另一个呢?

您正在循环中实例化随机实例。这将导致它在几个迭代中使用相同的种子,因为默认种子是基于时间的,不会在较低级别上进行区分


在循环之外实例化它,也许可以添加一些奇特的东西,如
ThreadLocal
,以避免这种情况

您正在循环中实例化随机实例。这将导致它在几个迭代中使用相同的种子,因为默认种子是基于时间的,不会在较低级别上进行区分


在循环之外实例化它,也许可以添加一些奇特的东西,如
ThreadLocal
,以避免这种情况

您正在循环中实例化随机实例。这将导致它在几个迭代中使用相同的种子,因为默认种子是基于时间的,不会在较低级别上进行区分


在循环之外实例化它,也许可以添加一些奇特的东西,如
ThreadLocal
,以避免这种情况

您正在循环中实例化随机实例。这将导致它在几个迭代中使用相同的种子,因为默认种子是基于时间的,不会在较低级别上进行区分

在循环之外实例化它,也许可以添加一些奇特的东西,如
ThreadLocal
,以避免这种情况

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;
            }
        }
    }
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);
}