C++从vector中随机选取符合长度要求的字符串时偶发无输出问题
问题1:运行偶尔无输出、无法稳定输出dive的问题分析与修复
问题原因
是的,该问题和if判断逻辑相关,但核心根源是随机选单词的范围包含了不符合条件的单词:
- 单词列表共有3个元素:
dive(4字符,符合<=4的条件)、friends(7字符,不符合)、laptop(6字符,不符合) - 每次随机选中不符合条件的单词时,if判断就会跳过输出,自然就没有返回结果
- 代码中
for(int i = 0; i < 1; i++)属于冗余逻辑,仅循环1次和直接写循环体代码没有区别
修复方案
如果要求每次都输出dive,直接过滤随机池,仅保留符合条件的单词即可:
#include <iostream> #include <string> #include <vector> #include <ctime> using namespace std; int main() { srand(time(NULL)); // 提前筛选出所有长度<=4的单词作为随机池 vector <string> ValidWords = {"dive"}; string n_words = ValidWords[rand() % ValidWords.size()]; cout << n_words << endl; return 0; }
问题2:保证每次随机输出dive或lego的修复方案
问题原因
和第一个问题逻辑一致:原始单词列表里存在table、laptop、friends三个长度超过4的无效单词,随机抽到这三个的时候就会无输出。
修复方案
方案1:提前筛选有效单词池(性能最优)
把符合条件的单词单独放到一个列表里作为随机池,再从这个池子里抽单词即可:
#include <iostream> #include <string> #include <vector> #include <ctime> using namespace std; int main() { srand(time(NULL)); // 提前筛选所有长度<=4的单词:dive、lego vector <string> ValidWords = {"dive", "lego"}; string n_words = ValidWords[rand() % ValidWords.size()]; cout << n_words << endl; return 0; }
方案2:循环抽取直到拿到有效单词(适配不想手动分类的场景)
如果要求必须从原始全量单词列表里筛选,不想提前手动分类,可以写循环反复抽取,直到抽到符合条件的单词为止:
#include <iostream> #include <string> #include <vector> #include <ctime> using namespace std; int main() { srand(time(NULL)); vector <string> Words = {"dive", "table", "laptop", "lego", "friends"}; string n_words; // 循环抽取直到拿到符合条件的单词 do { n_words = Words[rand() % Words.size()]; } while(n_words.length() > 4); cout << n_words << endl; return 0; }
内容的提问来源于stack exchange,提问作者Gaspar
相关产品推荐
相关产品推荐

