随机姓名生成器中c后接h的条件规则不生效问题咨询
问题根因
- 非
c的逻辑分支单次循环会添加1~2个字符(50%概率加1个辅音,50%概率加1个元音+1个辅音),但循环计数器i每次仅自增1,导致后添加的辅音如果是c,根本不会被下一轮循环的randomName[i-1]判定命中,自然不会触发加h的逻辑,这就是你设置100%概率仍然出现c后无h的核心原因。 - 循环计数逻辑和实际字符新增逻辑不匹配,你设定的
randomLength是目标姓名长度,但现有代码生成的姓名长度完全不可控,会远超出该数值。
修复方案
如果你希望保留原有“优先生成元音+辅音组合”的拼写逻辑,可以直接在新增辅音后立即判断是否为c,同步触发加h逻辑,修改后代码如下:
randomName.clear(); // 处理首字符 if (startsWithVowel) { randomName += vowels[rand() % 5]; } else { char firstConsonant = consonants[rand() % 21]; randomName += firstConsonant; // 首字符为c直接加h,长度足够的情况下 if (firstConsonant == 'c' && randomName.length() < randomLength) { /*int chance = rand() % 100 + 1; if (chance < 31)*/ randomName += 'h'; } } // 补充字符直到达到目标长度 while (randomName.length() < randomLength) { int chance = rand() % 100 + 1; if (chance < 51) { randomName += vowels[rand() % 5]; // 加元音后如果已经达到长度直接退出 if (randomName.length() >= randomLength) { break; } } // 新增辅音 char consonant = consonants[rand() % 21]; randomName += consonant; // 辅音为c则按规则加h,判断剩余长度 if (consonant == 'c' && randomName.length() < randomLength) { /*int cChance = rand() % 100 + 1; if (cChance < 31)*/ randomName += 'h'; } }
如果你希望简化逻辑,每次循环仅新增一个字符,也可以使用更简洁的单字符循环方案:
randomName.clear(); while (randomName.length() < randomLength) { // 首字符特殊处理 if (randomName.empty()) { if (startsWithVowel) { randomName += vowels[rand() % 5]; } else { randomName += consonants[rand() % 21]; } continue; } // 上一个字符为c直接加h if (randomName.back() == 'c') { /*int chance = rand() % 100 + 1; if (chance < 31)*/ randomName += 'h'; continue; } // 普通情况50%加元音,50%加辅音 int chance = rand() % 100 + 1; if (chance < 51) { randomName += vowels[rand() % 5]; } else { randomName += consonants[rand() % 21]; } }
内容的提问来源于stack exchange,提问作者Abraham Elfenbaum
相关产品推荐
相关产品推荐

