我正在开发一个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);
}
Run Code Online (Sandbox Code Playgroud)
如果需要更多代码,请告诉我,我会编辑.有没有人对我如何纠正这个有任何想法?我已经"玩弄"了rand()函数的数量,但实际上并没有做太多.他们似乎仍然只是在屏幕上的不同点聚集.我很感激帮助.万一有人需要知道,我在VS2012中创建了这个.
Who*_*aig 10
这个功能没有业务:
srand(time(0));
Run Code Online (Sandbox Code Playgroud)
这应该在程序开始时调用一次(一个好地方就在里面main()); 而且大多数 - 肯定不在您的显示例程中.种子一旦被设定,你永远不应该再为你的程序,除非你想重复先前的序列(由它的外观,你不这样做)这样做.
也就是说,我强烈建议<random>您使用C++ 11标准库附带的功能.有了它,你可以建立分布(例如:uniform_int_distribution<>),会做很多的工作模为你,并正确解释的问题,这样的事情可能会遇到(安东指出,对于一个基于模某些号码的相似性).
花一些时间<random>.这很值得.使用您正在使用的三个范围的示例:
#include <iostream>
#include <random>
using namespace std;
int main()
{
std::random_device rd;
std::default_random_engine rng(rd());
// our distributions.
std::uniform_int_distribution<> dist1(50,60);
std::uniform_int_distribution<> dist2(200,300);
std::uniform_int_distribution<> dist3(0,100);
for (int i=0;i<10;++i)
std::cout << dist1(rng) << ',' << dist2(rng) << ',' << dist3(rng) << std::endl;
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
输出(明显不同).
58,292,70
56,233,41
57,273,98
52,204,8
50,284,43
51,292,48
53,220,42
54,281,64
50,290,51
53,220,7
Run Code Online (Sandbox Code Playgroud)
是的,它真的很简单.就像我说的那样,那个图书馆是这只猫的睡衣.有很多它提供了更多的东西,包括随机正态分布,不同的发动机后端,等我强烈建议你检查了进去.