C语言rand()生成指定范围外数值问题求助
问题分析与修复方案
嘿,我一眼就揪出你遇到的问题啦!那些离谱的极大值、负数,根源都是变量作用域搞的鬼,咱们一步步理清楚:
核心问题:变量重复定义导致未初始化垃圾值
你在generateDungeon函数开头声明了四个变量:
int ranRow, ranCol, ranWidth, ranHeight;
但在while循环内部,又重新用int定义了同名变量:
int ranRow = genRan(18, 1); int ranCol = genRan(77,1); int ranWidth = genRan(8,3); int ranHeight = genRan(7,2);
这就导致:
- 循环里的
ranRow等变量是循环块内的局部变量,一旦跳出while循环,这些变量就被销毁了 - 你在循环外声明的那四个变量,自始至终都没被赋值,属于未初始化的垃圾值,打印出来自然是乱七八糟的随机数值
快速修复:去掉循环内变量的int声明
把循环里的变量定义改成直接赋值,让生成的随机数存到你一开始声明的变量里:
while(check == false){ ranRow = genRan(18, 1); // 去掉前面的int ranCol = genRan(77,1); ranWidth = genRan(8,3); ranHeight = genRan(7,2); if((ranCol + ranWidth) <= 78 && (ranRow + ranHeight) <= 19){ check = true; } }
额外优化建议
- 规范函数返回类型:
generateDungeon函数最好显式加上void返回类型,避免默认int带来的潜在问题:void generateDungeon(){ // 函数内容不变 } - 修正随机数范围逻辑:你的
genRan函数当前的写法,生成的范围其实是[numLow, numLow + numHigh -1],而不是[numLow, numHigh]。比如genRan(8,3)会生成3到10(而非3到8),这会导致你的while循环需要多次重试才能满足边界条件。如果要生成**闭区间[numLow, numHigh]**的随机数,应该修改genRan函数:
这样int genRan(int numHigh, int numLow){ // 计算区间长度:numHigh - numLow + 1 int range = numHigh - numLow + 1; int ranNum = rand() % range + numLow; return ranNum; }genRan(8,3)就会正确生成3到8之间的随机数,genRan(18,1)生成1到18,完美匹配你的边界判断逻辑。
把这些修改完,你就能得到正常的随机数啦!
内容的提问来源于stack exchange,提问作者Mitchell Kerr
相关产品推荐
相关产品推荐

