gpt4 book ai didi

c# - 列表 中的 ArgumentOutOfRangeException

转载 作者:太空宇宙 更新时间:2023-11-03 18:06:33 24 4
gpt4 key购买 nike

我在调用该方法时抛出此异常。该列表恰好包含 52 个对象(卡片数量)。有什么建议可能导致它吗?也许是 Add 和 RemoveAt 方法?或者也许是随机的?编译器还告诉问题出在 deck.Add(temp[j]);行。

public void Shuffle()
{
List<Card> temp = new List<Card>();
Random rand = new Random();
for (int i = 0; i < 52; i++)
{
for (int j = rand.Next(i, 52); j < 52; j++)
{
temp.Add(deck[j]);
deck.RemoveAt(j);
deck.Add(temp[j]);
}
}
}

最佳答案

好吧,让我们假设我们正处于循环的第一次运行中。外循环和内循环的第一次迭代。 i0Rand(i, 52) 产生 13

所以我们有:

i - 0
j - 13
temp - empty list
deck - assume this is a list with 52 elements

现在让我们在循环中运行三行代码:

temp.Add(deck[j]);

获取 deck 的第 13 个项目并将其添加到 temp。 OK完成。 temp 现在有 1 个项目。

 deck.RemoveAt(j);

移除牌组中的第 13 项。好的,好的。

 deck.Add(temp[j]);

获取 temp 中的第 13 项并将其添加到,等等,什么?1? temp 只有 1 项! 异常! 异常!


首先不需要 temp 列表。有一个 very good shuffling algorithm这涉及一次(而不是 N 次)遍历原始项目列表。您只需要一个 temp 变量来保存一个值,同时将它与另一个变量交换。像这样:

public void Shuffle()
{
Card temp;
Random rand = new Random();
for (int i = deck.Length; i >= 1; i--)
{
int j = rand.Next(0, i + 1);
temp = deck[i];
deck[i] = deck[j];
deck[j] = temp;
}
}

完成。

关于c# - 列表 <T> 中的 ArgumentOutOfRangeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27768049/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com