洗牌方法报错‘检测到不可达代码’问题排查与解决
问题修复:实现100次随机交换的数组洗牌
问题根源分析
你的代码存在两个核心问题导致循环失效:
- 循环内提前返回:
return array;写在for循环内部,第一次循环执行完交换就直接返回方法,后续迭代根本不会执行,这也是IDE提示“i++不可达代码”的原因。 - Random实例重复创建:每次循环都新建
Random对象,由于默认种子依赖系统时钟,循环执行速度极快时,多个Random实例会使用相同种子,生成重复的随机数序列,交换效果会大打折扣甚至无效。
修正后的代码
int[] Shuffle(int[] array) { Random r = new Random(); for (int i = 0; i < 100; i++) { int x = r.Next(array.Length); int y = r.Next(array.Length); (array[x], array[y]) = (array[y], array[x]); } return array; }
关键修正点
- 将
Random实例的创建移到for循环外部,确保整个洗牌过程使用同一个随机数生成器,避免重复种子问题。 - 移除循环内部的
return array;,仅在100次交换全部完成后返回数组,保证循环能完整执行100次迭代。
额外说明
如果需要更高效、符合统计学公平性的洗牌方式,推荐使用Fisher-Yates洗牌算法,它只需要遍历数组一次即可完成公平洗牌,比固定100次交换的效率更高。不过如果你的需求明确是执行100次随机交换,上面的修正代码完全满足要求。
内容的提问来源于stack exchange,提问作者vvlad
相关产品推荐
相关产品推荐

