无限循环随机数

时间:2013-09-21 16:34:45

标签: c++ random while-loop

我有这段代码:

void generar() {

    while (true) {
        if (yPos == topOfTheWorld) {
            scene[xPos][yPos] = 2;
        } else if (yPos >= topOfTheWorld) {
            scene[xPos][yPos] = 1;
        } else if(yPos < topOfTheWorld) {
            scene[xPos][yPos] = 0;
        } else {
            scene[xPos][yPos] = 0;
        }

        yPos++;

        if(yPos>worldHeight) {
            topOfTheWorld += 0;
            yPos = 0;
            xPos++;
        }

        if (xPos>worldWidth) {
                    break;
        }
    }

std::ofstream output("mapa.txt");
    for(int y=0;y<worldHeight;y++) {
        for(int x=0;x<worldWidth;x++) {
            output<<scene[x][y];

            if(x<(worldWidth-1)){output<<",";}
        }
        if(y<(worldHeight-1)){output<<std::endl;}
    }

MessageBox(0, "World generation has finished!", "Finished!", MB_OK);

}

生成一个基于数组的世界。但是当我补充说:

slope = random(5)-2;

要:

if(yPos == worldHeight) {
    topOfTheWorld += 0; //There would be the slope var...

if(yPos == worldHeight) {
    slope = random(5)-2;
    topOfTheWorld += slope;

由于某种原因,while变成了一个无限循环,我不知道为什么。

(随机函数)

#include <time.h>
#include <windows.h>

int random(int n = 0) {

srand(time(NULL));

if(n!=0){
return rand() % n;
} else {
return rand();
}

}

(变量)

const int worldWidth = 50;
const int worldHeight = 26;
int topOfTheWorld = worldHeight/2;
int xPos = 0;
int yPos = 0;
int scene[worldWidth][worldHeight];
int slope;

我该怎么办?

2 个答案:

答案 0 :(得分:2)

您表明scene定义为:

int scene[worldWidth][worldHeight];

但是,您的代码包含:

        if (xPos>worldWidth) {
                    break;
        }

这意味着在xPos == worldWidth时,您实际上会在数组边界外写入一个值,这会导致未定义的行为。添加slope变量可能会导致变量组织以未定义行为最终影响循环控制变量和/或所有循环控制变量的值的方式更改。

要修复,您应该使用以下命令更改错误检查:

        if (xPos>=worldWidth) {
                    break;
        }

您已经使用代码编辑了您的问题,这使得yPos检查错误的方式与此类似。

答案 1 :(得分:1)

random函数

中反复调用srand

修正: -

void generar() {

srand(time(NULL)); //Remove srand() from random(), add it here
bool finished = false;

    while (!finished) {
        if (yPos == topOfTheWorld) {
            scene[xPos][yPos] = 2;
        } else if (yPos >= topOfTheWorld) {
            scene[xPos][yPos] = 1;
        } else if(yPos < topOfTheWorld) {
            scene[xPos][yPos] = 0;
        } else {
            scene[xPos][yPos] = 0;
        }

        yPos++;

        if(yPos == worldHeight) {
           // slope = random(5)-2; your random call
            topOfTheWorld += 0;
            yPos = 0;
            xPos++;
        }

        if (xPos>worldWidth) {
            finished = true;
           //goto Guardar; not required, 
          //also use of goto is bad programming practice
        }
    }