如何根据猜测结果生成比前一个随机数更大或更小的随机整数?
实现动态范围的随机数猜测游戏
嘿,我完全get到你的需求了——你不想用那种生硬的循环加减1来调整随机数,而是希望根据用户的猜测结果动态缩窄随机数的生成区间:猜小了,下次就在更大的区间里生成新数;猜大了,就在更小的区间里生成。这其实是经典猜数字游戏的优化逻辑,核心靠维护一对「上下边界」来实现,下面给你完整的实现方案:
#include <iostream> #include <cstdlib> #include <ctime> #include <string> using namespace std; int main(){ int counter = 0; unsigned int guess; // 初始化随机数种子,确保每次运行生成不同的随机序列 srand(time(NULL)); // 定义初始随机数范围,这里默认1-100,你可以按需修改 unsigned int lower_bound = 1; unsigned int upper_bound = 100; // 在初始区间内生成第一个随机数 unsigned int random_number = rand() % (upper_bound - lower_bound + 1) + lower_bound; cout << "欢迎玩猜数字游戏!我已经想好了一个" << lower_bound << "到" << upper_bound << "之间的数~" << endl; while (true) { counter++; cout << "请输入你的猜测:"; cin >> guess; if (guess == random_number) { cout << "牛啊!你用了" << counter << "次就猜对了!" << endl; break; } else if (guess < random_number) { cout << "猜小啦!下次试试更大的数~" << endl; // 调整下限:下一次的随机数必须比当前猜测大,所以把下限设为guess+1 lower_bound = guess + 1; // 在新的有效区间内生成下一个随机数 random_number = rand() % (upper_bound - lower_bound + 1) + lower_bound; } else { cout << "猜大啦!下次试试更小的数~" << endl; // 调整上限:下一次的随机数必须比当前猜测小,所以把上限设为guess-1 upper_bound = guess - 1; // 在新的有效区间内生成下一个随机数 random_number = rand() % (upper_bound - lower_bound + 1) + lower_bound; } // 边界保护:防止用户输入超出当前区间的数导致边界交叉,重置游戏 if (lower_bound > upper_bound) { cout << "哎呀,范围出错了!咱们重新开始吧~" << endl; lower_bound = 1; upper_bound = 100; random_number = rand() % (upper_bound - lower_bound + 1) + lower_bound; counter = 0; } } return 0; }
核心逻辑说明:
- 动态边界调整:用
lower_bound和upper_bound实时记录当前随机数的有效范围,每次猜测后更新边界,确保下一次生成的随机数完全符合「猜小变大,猜大变小」的要求。 - 区间随机数生成公式:
rand() % (upper_bound - lower_bound + 1) + lower_bound是生成[lower_bound, upper_bound]闭区间内随机整数的标准写法,保证每次生成的数都在当前有效范围内。 - 健壮性保护:加入了
lower_bound > upper_bound的判断,避免用户输入不符合当前区间的数导致逻辑崩溃,提升游戏的容错性。
这样实现就完全替代了原有的「加1/减1」生硬逻辑,每次的随机数都是在合理区间内生成的,游戏体验也更顺畅~
内容的提问来源于stack exchange,提问作者pleka7
相关产品推荐
相关产品推荐

