【发布时间】:2013-09-08 23:08:04
【问题描述】:
我正在做一个 openGL 项目,我的 rand 函数没有给我足够大的随机范围。 我的任务是编写一个钻石程序,其中一颗钻石位于屏幕中心,5 颗随机放置在屏幕上的其他位置。正在发生的事情是我的中心钻石在它应该在的位置,而其他五颗正在与中心左侧的一小部分随机排列在一起。我已经包含了绘制菱形的函数。
void myDisplay(void)
{
srand(time(0));
GLintPoint CenterPoint;
int const size = 20;
CenterPoint.x = screenWidth / 2;
CenterPoint.y = screenHeight / 2;
glClear(GL_COLOR_BUFFER_BIT);
drawDiamond(CenterPoint, size);
for (int i = 0; i < 5; i++)
{
GLfloat x = rand() % 50 + 10;
GLfloat y = rand() % 200 + 100;
GLfloat size = rand() % 100;
GLintPoint diam = {x,y};
drawDiamond(diam, size);
}
如果需要更多代码,请告诉我,我会编辑。有人对我如何纠正这个有任何想法吗?我已经“玩弄”了 rand() 函数的数字,实际上似乎并没有做太多事情。它们似乎仍然聚集在屏幕上的不同点。我很感激帮助。以防万一有人需要知道,我正在 VS2012 中创建它。
【问题讨论】:
-
这是大多数伪随机数生成器的问题。它们本质上是非常确定的,要使它们看起来“随机”,您必须提供优质种子。如果您使用
time (NULL)作为种子同时生成 3 或 4 个进程,它们将生成相同的事件序列。您可以考虑定期重新播种 RNG,使用不同的种子(可能是进程 ID)或两者的某种组合。同样在rand ()上使用模数实际上会影响结果的质量,您应该将其转换为浮点数并除以RAND_MAX并根据您所需的范围进行缩放。 -
您似乎也没有尝试生成全范围的值。我认为像
GLfloat x = rand() % (screenWidth - 20) + 10;这样的东西更适合 y 值。除非您的屏幕是 70x400,否则可以解释角落中的集群。 -
@RetiredNinja 我对重复的种子和不均匀的模结果如此着迷,这完全没有引起人们的注意。这是一个优秀的点。