R中的rand()输出不在指定范围内的数字

时间:2018-01-21 00:06:39

标签: c gcc

我无法生成随机数字。由于某些原因,当我在while循环之后打印随机数时,我会变得很大,而且会有一些负数。不知道发生了什么,所以非常感谢任何帮助!

int genRan(int numHigh, int numLow){

    int ranNum = rand() % (numHigh) + numLow;
    return ranNum;

}

generateDungeon(){
    int ranRow, ranCol, ranWidth, ranHeight;
    for(int i = 0; i<5; i++){
        bool check = false;
        while(check == false){
            int ranRow = genRan(18, 1);
            int ranCol = genRan(77,1);
            int ranWidth = genRan(8,3);
            int ranHeight = genRan(7,2);
            if((ranCol + ranWidth) <= 78 && (ranRow + ranHeight) <= 19){
                check = true;
            }

        }
        printf("%d\n", ranRow);
        printf("%d\n", ranCol);
        printf("%d\n", ranWidth);
        printf("%d\n\n\n", ranHeight);

        for(int x = ranCol; x<ranWidth + ranCol; x++){
            for(int y = ranRow; y<ranHeight + ranRow; y++){
                //dungeon[x][y] = '.';
            }
            //printf("%d ", x);
        }
   }
}

int main(){
    srand(time(0));
    generateDungeon();
    //genRan();
    return 0;
}

1 个答案:

答案 0 :(得分:1)

此代码:

int ranRow, ranCol, ranWidth, ranHeight;
    for(int i = 0; i<5; i++){
        bool check = false;
        while(check == false){
            int ranRow = genRan(18, 1);
            int ranCol = genRan(77,1);
            int ranWidth = genRan(8,3);
            int ranHeight = genRan(7,2);
            if((ranCol + ranWidth) <= 78 && (ranRow + ranHeight) <= 19){
                check = true;
            }

在循环中定义对象ranRowranColranWidthranHeight。这些新定义会隐藏循环外的先前定义,并且循环外的对象不会更改。这导致它们不被赋值,因此后来使用它们具有未定义的行为。要解决此问题,请从循环内的语句中删除int个关键字,因此它们是简单的赋值而不是定义。

(您的编译器应该警告您使用未初始化的对象。如果没有,请查找打开更多警告并默认使用它们的方法。)

在此代码中:

int ranNum = rand() % (numHigh) + numLow;

目前尚不清楚您是否真的想要(numHigh)。您可能需要(numHigh-numLow)(numHigh-numLow+1)

genRan中更精确地使用范围可以消除使用while循环来设置初始值。

如果generateDungeon无意返回值,则应声明为:

void generateDungeon()