【问题标题】:How to reset or 'clean' Random如何重置或“清理”随机
【发布时间】:2015-03-24 22:43:50
【问题描述】:

我在一个类中使用 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;
            }
        }
    }

在基类中随机化形状属性:

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

我在图片框中绘制这些形状。出于某种原因,在图片框的左侧三分之一处绘制圆形,在中间三分之一处绘制三角形,在右侧三分之一处绘制矩形。

如果在 switch 中将形状构造放在不同的情况下,它会改变它们被绘制在哪三分之一。

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

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

【问题讨论】:

    标签: c# random drawing


    【解决方案1】:

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

    在循环之外实例化它,并可能添加一些花哨的东西,如ThreadLocal 来避免这种情况。

    【讨论】:

      猜你喜欢
      • 2017-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      相关资源
      最近更新 更多