字符串重复校验循环逻辑异常:重复生成相同团队组合问题排查
解决团队组合重复的问题
嘿,我仔细看了你的代码,发现导致偶尔出现相同团队组合的原因主要有两个:
- 初始生成的
secondRound可能就和firstRound完全一致,但你的循环仅在相等时才尝试重新生成,若随机数连续抽到相同的partnerTwo(尤其是可选条目不多时),就会出现多次尝试后仍重复的情况。 - 当
myCount达到5时直接break,但此时secondRound可能仍然和firstRound相同,没有做任何兜底处理,最终就会留下重复的组合。
这里给你调整后的代码,能更可靠地避免重复:
firstRound = $"{i}&{partnerOne}"; secondRound = $"{i}&{partnerTwo}"; int myCount = 0; // 检查初始是否重复,若重复则进入重试逻辑 while (firstRound.Equals(secondRound)) { myCount++; // 嵌套循环确保抽到的partnerTwo绝对不等于partnerOne int spotTwo; do { spotTwo = rnd.Next(heelerEntries.Count); } while (heelerEntriesTwo[spotTwo].Equals(partnerOne)); partnerTwo = heelerEntriesTwo[spotTwo]; secondRound = $"{i}&{partnerTwo}"; if (myCount == 5) { MessageBox.Show("连续5次尝试生成不同组合失败!"); // 兜底逻辑:直接选取第一个不等于partnerOne的条目 var fallbackPartner = heelerEntriesTwo.FirstOrDefault(p => !p.Equals(partnerOne)); if (fallbackPartner != null) { partnerTwo = fallbackPartner; secondRound = $"{i}&{partnerTwo}"; } break; } }
关键改进点:
- 生成
spotTwo时嵌套了do-while循环,从根源上确保抽到的partnerTwo不会和partnerOne相同,避免生成重复的组合字符串。 - 当5次尝试后增加了兜底逻辑:如果存在符合条件的不同条目,直接强制选择第一个,避免最终留下重复组合。
- 用字符串插值
$""替代拼接,让代码更简洁易读(你也可以保留原有的拼接方式)。
另外还有个小建议:如果heelerEntriesTwo里的条目过少(比如只有1个),那不管怎么随机都会重复,建议在代码开头增加前置检查:
if (heelerEntriesTwo.Distinct().Count() < 2) { MessageBox.Show("条目数量不足,无法生成不同的团队组合!"); return; // 或执行其他对应处理逻辑 }
内容的提问来源于stack exchange,提问作者Justin Kowalsky
相关产品推荐
相关产品推荐

