如何从数组中随机取出多个不重复的项

如题所述

//从一个给定的数组arr中,随机返回num个不重复项function getArrayItems(arr:Array, num:Number):Array { //新建一个数组,将传入的数组复制过来,用于运算,而不要直接操作传入的数组;var temp_array:Array =new Array(); for (var index in arr) { temp_array.push(arr[index]); } //取出的数值项,保存在此数组var return_array:Array =new Array(); for (var i =0; i<num; i++) { //判断如果数组还有可以取出的元素,以防下标越界if (temp_array.length>0) { //在数组中产生一个随机索引var arrIndex:Number = Math.floor(Math.random()*temp_array.length); //将此随机索引的对应的数组元素值复制出来 return_array[i] = temp_array[arrIndex]; //然后删掉此索引的数组元素,这时候temp_array变为新的数组 temp_array.splice(arrIndex, 1); } else { //数组中数据项取完后,退出循环,比如数组本来只有10项,但要求取出20项.break; } } return return_array; } //测试var my_array:Array =new Array(); for (var i =0; i<20; i++) { my_array[i] ="Num:"+i; } my_array = getArrayItems(my_array, 5); for (var i =0; i<my_array.length; i++) { trace(my_array[i]); } JavaScript代码,和AS类似:
<script language="javascript">//从一个给定的数组arr中,随机返回num个不重复项function getArrayItems(arr, num) { //新建一个数组,将传入的数组复制过来,用于运算,而不要直接操作传入的数组;var temp_array =new Array(); for (var index in arr) { temp_array.push(arr[index]); } //取出的数值项,保存在此数组var return_array =new Array(); for (var i =0; i<num; i++) { //判断如果数组还有可以取出的元素,以防下标越界if (temp_array.length>0) { //在数组中产生一个随机索引var arrIndex = Math.floor(Math.random()*temp_array.length); //将此随机索引的对应的数组元素值复制出来 return_array[i] = temp_array[arrIndex]; //然后删掉此索引的数组元素,这时候temp_array变为新的数组 temp_array.splice(arrIndex, 1); } else { //数组中数据项取完后,退出循环,比如数组本来只有10项,但要求取出20项.break; } } return return_array; } //测试var my_array =new Array(); for (i =0; i <20; i++) { my_array[i] ="Num:"+i; } my_array = getArrayItems(my_array,5); for (i =0; i < my_array.length; i++) { alert(my_array[i]); } </script> C#代码:
publicstatic IList<string> getListItems(IList<string> list, int num) { //新建一个泛型列表,将传入的列表复制过来,用于运算,而不要直接操作传入的列表; //这样写是引用复制,不对啦,谢谢Osamede指出. //IList<string> temp_list = list; //另外这样写也要注意,也不是深度复制喽,关于深度复制可以做为一个新话题来说,这儿就不说啦; IList<string> temp_list =new List<string>(list); //取出的项,保存在此列表 IList<string> return_list =new List<string>(); //Random random = new Random(unchecked((int)DateTime.Now.Ticks)); Random random =new Random(); for (int i =0; i < num; i++) { //判断如果列表还有可以取出的项,以防下标越界if (temp_list.Count >0) { //在列表中产生一个随机索引int arrIndex = random.Next(0, temp_list.Count); //将此随机索引的对应的列表元素值复制出来 return_list.Add(temp_list[arrIndex]); //然后删掉此索引的列表项 temp_list.RemoveAt(arrIndex); } else { //列表项取完后,退出循环,比如列表本来只有10项,但要求取出20项.break; } } return return_list; } 测试:
温馨提示:答案为网友推荐,仅供参考
相似回答