【发布时间】:2013-02-26 02:55:53
【问题描述】:
正在处理另一个项目,我们需要使用mt19937 来随机生成数字。我们应该让它根据网格的截面随机选择一个 x 和 y 坐标。例如,我的函数将minX、maxX、minY、maxY 传递给函数。我的 x 坐标工作正常。在测试运行时,我不断地随机出错。有时它会运行 10 次没有问题,然后出现错误。我添加了一些自调试行来显示 mt 生成器实际生成的内容。就像我说的,x 工作正常,y 有时也可以。它会随机给我一个 -3437892 或 9743903。
这是我的代码:
void DungeonLevel::generateRoom(int minX,int maxX,int minY, int maxY){
mt19937 mt;
mt.seed( time(NULL) );
// Calculate random width and height; these both range
// from 4-13
int iRandomWidth = 4 + (mt() % 10);
int iRandomHeight = 4 + (mt() % 10);
// Calculate the start points in both X and Y directions
int iStartX;
iStartX = mt() % (maxX - iRandomWidth);
cout << "xStart: " << iStartX<<endl; //cout flag
while ((iStartX > maxX) && (iStartX >= 0)){
cout << "xStart: " << iStartX<<endl;//cout flag
iStartX = mt() % (maxX - iRandomWidth);
}
int iStartY = 0;
iStartY = mt() % (maxY - iRandomHeight);
cout<<"yStart: " <<iStartY<<endl; //cout flag
while ((iStartY > maxY)){
cout<<"yStart: " <<iStartY<<endl;//cout flag
iStartY = (mt() % (maxY - iRandomHeight));
}
// Iterate through both x and y coordinates, and
// set the tiles to room tiles
// SINGLE ROOM
for( int x = iStartX; x <= iStartX + iRandomWidth; x++ ){
for( int y = iStartY; y <= iStartY + iRandomHeight; y++ ){
if (y == iStartY){
dungeonGrid[y][x] = '-';
}
else if (iStartX == x){
dungeonGrid[y][x] = '|';
}
else if (y == (iStartY+iRandomHeight)){
dungeonGrid[y][x] = '-';
}
else if (x == (iStartX+iRandomWidth)){
dungeonGrid[y][x] = '|';
}
else {
dungeonGrid[y][x] = '.';
}
}
}
}
【问题讨论】:
-
我很困惑为什么它只发生在 iStartY 上。 X 工作正常。
-
mt19937是打算成为 C++11 random number engine 还是某些用户定义的类型? -
在这种情况下,您的参数(minX、maxX 等)有哪些值?
-
@ModdedLife 我怀疑
minY有时小于 13。这可以解释。