我在这个类中生成带有给定随机数的矩形。
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 Framework。
答案 0 :(得分: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
的种子。根据此处使用的构造函数的documentation:
默认种子值是从系统时钟派生的,并且是有限的 分辨率。
也就是说,如果循环运行得足够快,循环中Random
的不同实例将使用相同种子进行初始化,从而导致它们生成相同的x
}和y
值:矩形然后重叠并且似乎缺失。这也解释了为什么你的代码在使用断点或消息框中断它时会起作用。
修改:此问题的最佳解决方案是在您的Random
语句之前初始化rand
或在您的循环之外创建单个for
实例(例如,作为类成员)在类的构造函数中。