本帖最后由 马振伟 于 2014-7-31 10:07 编辑
不断的重复用contains的话,会有很多多余的循环,可以考虑随机索引,然后把随机到的索引对应的数字移除,这样只要100次循环就可以了
以下是项目中我们用的代码,在一个给定集合中,获取一系列不重复的元素,根据你的需求,第一个参数就是一个1~100之间数字组成的集合,用一个for循环就可以创建出来了,第二个参数是100,第三个参数决定你是否不想更改原来集合元素的顺序,如果选了false,原来集合和返回值是一样的
/// <summary>
/// 在一个集合中获取一系列不重复随机数(同一个索引元素不会获取两次,不考虑集合本身元素重复)
/// </summary>
/// <param name="sourceList">源集合</param>
/// <param name="neededCount">需求的数量</param>
/// <param name="sourceListSafe">是否保留源集合,如果为true,则传入集合不会被更改</param>
/// <returns></returns>
public static List<int> GetNoRepeatList(List<int> sourceList, int neededCount, bool sourceListSafe)
{
List<int> result = new List<int>();
if (neededCount > sourceList.Count)
{
Debug.LogError("需求的数量超出原始集合长度,请确认参数"); return null;
}
List<int> copyList = sourceListSafe ? CopyList(sourceList) : sourceList;
int index;
for (int i = 0; i < neededCount; i++)
{
index = Random.Range(0, copyList.Count);
result.Add(copyList[index]);
copyList.RemoveAt(index); //移除随机到的元素
}
return result;
}
/// <summary>
/// 获取一个集合的浅拷贝副本
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sourceList"></param>
/// <returns></returns>
public static List<T> CopyList<T>(List<T> sourceList)
{
List<T> result = new List<T>();
for (int i = 0; i < sourceList.Count; i++)
{
result.Add(sourceList);
}
return result;
}
|