0

我在这个类中生成具有给定随机数的矩形。

class Rect
{
     double x;
     double y;

    public Rect(double _x, double _y)
    {
        x = _x;
        y = _y;

    }
    public void Draw()
    {
        Gl.glBegin(Gl.GL_QUADS);
        Gl.glVertex2d(x + (-0.05d), y + (-0.05d));  
        Gl.glVertex2d(x + (-0.05d), y + (0.05d));     
        Gl.glVertex2d(x + (0.05d),  y + (0.05d));          
        Gl.glVertex2d(x + (0.05d),  y + (-0.05d));     
        Gl.glEnd();

    }
}

我在 Paint 函数中调用它。

        private void simpleOpenGlControl1_Paint(object sender, PaintEventArgs e)
        {
          Gl.glClearColor(0, 1, 0, 0);
          Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);

            for (int i = 0; i < 4; i++)
            {
              rand = new Random();
              double x = 2 * rand.NextDouble() - 1;
              double y = 2 * rand.NextDouble() - 1;

              rect= new Rect(x,y);
              rect.Draw(); 
            }
        }

一切看起来都很好,但有问题。我看不到所有的矩形。其中一些失踪了。但是,如果我在某处切换断点或放置MessageBox.Show(x+" "+y);代码可以正常工作并向我显示我想要的矩形数量。我认为我的代码是正确的,但 OpenGL 有问题。我正在使用 Tao 框架。

4

1 回答 1

1

我的猜测是这段代码的问题是:

for (int i = 0; i < 4; i++)
{
    rand = new Random();
    double x = 2 * rand.NextDouble() - 1;
    double y = 2 * rand.NextDouble() - 1;

    rect= new Rect(x,y);
    rect.Draw(); 
}

您正在循环的每次迭代中创建一个新Random实例,然后使用该实例生成两个随机值。生成的值序列Random取决于用于初始化Random. 根据此处使用的构造函数的文档:

默认种子值来自系统时钟并且具有有限的分辨率。

也就是说,如果您的循环运行得足够快,则循环中的不同实例Random将使用相同的种子进行初始化,从而导致它们生成相同的xy值:然后矩形重叠并且似乎丢失了。这也解释了为什么你的代码在使用断点或消息框中断它时工作。

编辑Random:这个问题的最佳解决方案是在循环之外创建一个实例,例如rand在你的for语句之前或(作为类成员)在你的类的构造函数中初始化。

于 2014-05-24T12:14:44.760 回答