You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法调用Random相关方法,List未写入且出现索引越界问题求助

问题分析与修复

问题现象

尝试创建List<int>并根据种子值随机排序,但目标列表始终无内容写入,调用List.ElementAt时抛出错误:

索引超出范围。必须是非负数且小于集合大小。参数名: index

断点显示TimeskipOrder列表从未被正确赋值。

代码片段

主文件代码

public static List<int> TimeskipOrder = new(17);
public static int Seed = 12345;

public static void Shuffle<T>(List<T> list, int seed)
{
    Seed = seed;
    var rng = new Random(seed);
    int n = list.Count;

    while (n > 1)
    {
        n--;
        int k = rng.Next(n + 1);
        T value = list[k];
        list[k] = list[n];
        list[n] = value;
    }
}

public static void Randomize()
{
    var numbers = new List<int>(Enumerable.Range(1, 17));
    Shuffle(numbers, Seed);
    TimeskipOrder.Clear();
    numbers.AddRange(TimeskipOrder);
}

窗体按钮点击代码

public void button2_Click(object sender, EventArgs e)
{
    TimeSkip.Randomize();
}

问题根源

Randomize方法最后一行逻辑完全颠倒:

  • 当前代码执行的是numbers.AddRange(TimeskipOrder),这是把**清空后的空列表TimeskipOrder**添加到临时列表numbers中,目标列表TimeskipOrder始终保持为空。
  • 正确逻辑应该是将打乱后的numbers内容写入TimeskipOrder。

修复代码

修改Randomize方法的最后一行:

public static void Randomize()
{
    var numbers = new List<int>(Enumerable.Range(1, 17));
    Shuffle(numbers, Seed);
    TimeskipOrder.Clear();
    // 将打乱后的结果写入目标列表
    TimeskipOrder.AddRange(numbers);
}

额外说明

  • 修复后,点击按钮调用Randomize时,TimeskipOrder会被正确填充1-17的随机排序值,后续调用ElementAt不会再出现索引越界问题。
  • Shuffle方法采用的Fisher-Yates洗牌算法逻辑正确,无需修改。

内容的提问来源于stack exchange,提问作者pokisal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 15:10:26