当 List 不为空时,从 List 中删除随机元素会导致无限循环
While List isn't empty, remove a random element from List results in infinite loop
我正在开发一个简单的 随机播放脚本。我有一个通用方法,它将 List<T>
和 returns 作为输入 List<T>
。返回的 List
应该是 shuffled。但是,代码陷入了无限循环,我不确定为什么。
这是我的代码:
private List<T> Shuffle<T>(List<T> p)
{
List<T> result = new List<T>();
int idx = 0;
while (p.Count > 0)
{
idx = Random.Range(0, p.Count);
print(idx);
result.Add(p[idx]);
p.Remove(p[idx]);
}
print("Shuffled");
return result;
}
我希望代码能够工作,因为 p.Count
越来越小 。但是,它 卡住了 。这是我制作的 while
循环的替代方法,它可以工作,但感觉有些草率:
for (int i = 0; i < p.Count; i++)
{
idx = Random.Range(0, p.Count);
print(idx);
result.Add(p[idx]);
p.Remove(p[idx]);
}
这更像是一个 "why" 问题而不是问题,但我仍然希望你能帮助我。提前致谢!
第一行
List<T> result = p;
是问题。请注意,result
和 p
共享 相同的引用 ,这就是为什么
result.Add(p[idx]);
添加到 result
和 p
以及 ,p.Count > 0
永远保持 (将 while (p.Count > 0)
变成 无限循环 )。应该是
private List<T> Shuffle<T>(List<T> p)
{
List<T> result = new List<T>(); // result and p are different lists now
while (p.Count > 0)
{
idx = Random.Range(0, p.Count);
print(idx);
result.Add(p[idx]); // Now we Add to result only, and Remove from p
p.RemoveAt(idx); // <- I suggest removing at index
}
print("Shuffled");
return result;
}
我正在开发一个简单的 随机播放脚本。我有一个通用方法,它将 List<T>
和 returns 作为输入 List<T>
。返回的 List
应该是 shuffled。但是,代码陷入了无限循环,我不确定为什么。
这是我的代码:
private List<T> Shuffle<T>(List<T> p)
{
List<T> result = new List<T>();
int idx = 0;
while (p.Count > 0)
{
idx = Random.Range(0, p.Count);
print(idx);
result.Add(p[idx]);
p.Remove(p[idx]);
}
print("Shuffled");
return result;
}
我希望代码能够工作,因为 p.Count
越来越小 。但是,它 卡住了 。这是我制作的 while
循环的替代方法,它可以工作,但感觉有些草率:
for (int i = 0; i < p.Count; i++)
{
idx = Random.Range(0, p.Count);
print(idx);
result.Add(p[idx]);
p.Remove(p[idx]);
}
这更像是一个 "why" 问题而不是问题,但我仍然希望你能帮助我。提前致谢!
第一行
List<T> result = p;
是问题。请注意,result
和 p
共享 相同的引用 ,这就是为什么
result.Add(p[idx]);
添加到 result
和 p
以及 ,p.Count > 0
永远保持 (将 while (p.Count > 0)
变成 无限循环 )。应该是
private List<T> Shuffle<T>(List<T> p)
{
List<T> result = new List<T>(); // result and p are different lists now
while (p.Count > 0)
{
idx = Random.Range(0, p.Count);
print(idx);
result.Add(p[idx]); // Now we Add to result only, and Remove from p
p.RemoveAt(idx); // <- I suggest removing at index
}
print("Shuffled");
return result;
}