我正在研究一个简单的 shuffle脚本。我有一个通用方法,该方法将一个List<T>
作为输入并返回一个List<T>
。返回的List
应该被洗牌。但是,代码陷入了无限循环,而且我不确定为什么。
这是我的代码:
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]);
}
这不是一个问题,而是一个“为什么” 的问题,但我仍然希望您能够为我提供帮助。预先感谢!
答案 0 :(得分:3)
第一行
List<T> result = p;
是问题。请注意,result
和p
共享相同的引用,这就是
result.Add(p[idx]);
添加到result
和p
,p.Count > 0
永远成立(将while (p.Count > 0)
变成< em>无限循环)。应该是
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;
}