다른 프로젝트에서 작업 중이므로 숫자를 임의로 생성하려면 mt19937
을 사용해야합니다. 우리는 그리드의 섹션을 기반으로 무작위로 x와 y 좌표를 선택해야합니다. 예를 들어, 내 함수는 minX
, maxX
, minY
, maxY
을 함수에 전달합니다. 내 x 좌표가 잘 작동합니다. 테스트가 끝나면 무작위로 오류가 발생했습니다. 때로는 문제없이 10 번 실행되고 오류가 발생합니다. mt 생성기가 실제로 생성하는 것을 표시하기 위해 일부 자체 디버그 라인을 넣었습니다. 내가 말했듯이, x는 잘 작동하고 y는 때로는 그렇습니다. 그것은 무작위로 나에게 줄거야 -3437892 또는 9743903.왜 내 mt19937 무작위 발전기가 우스운 결과를 내고 있습니까? C++
여기 내 코드입니다 :
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는 잘 작동합니다. – ModdedLife
'mt19937'는 [C++ 11 난수 엔진] (http://en.cppreference.com/w/cpp/numeric/random/mersenne_twister_engine)이거나 일부 사용자 정의 유형입니까? –
그런 경우 매개 변수 (minX, maxX 등)에 어떤 값이 있습니까? – Slava