diff --git a/src/comMisc/utList.erl b/src/comMisc/utList.erl index 53e99e9..5c93b00 100644 --- a/src/comMisc/utList.erl +++ b/src/comMisc/utList.erl @@ -108,75 +108,35 @@ getRandFromList(Num, List) -> List -- Result. -%%打乱列表函数 List =[] 返回 打乱后列表 List2 -confuseList(List) -> - confuseList(List, []). - -confuseList(List, Result) -> - confuseList(List, rand:uniform_s(1, length(List)), Result). - -confuseList(_List, 0, Result) -> - Result; -confuseList(List, Nth, Result) -> - {NthData, Remain} = extract_member(rand:uniform_s(1, Nth), List), - confuseList(Remain, length(Remain), [NthData | Result]). - -%%提取列表中第Nth个元素,{NthData, RemainList} -extract_member(Nth, List) -> - extract_member(Nth, List, []). - -extract_member(1, List1, List2) -> - case List1 of - [R] -> - {R, List2}; - [R | L] -> - {R, List2 ++ L} - end; - -extract_member(Nth, [R | List1], List2) -> - extract_member(Nth - 1, List1, List2 ++ [R]). - -%% ---------------------------------------------------- -%% @doc -%% 打乱列表函数 -%% @end +%%打乱列表函数 List =[] 返回 打乱后列表 List2 元素小于300多个的时候 使用confuseList 大于300多个的时候使用confuseList2 %% ---------------------------------------------------- -confuse_list(List) -> - confuse_list(List, length(List), []). - -confuse_list([], _Cnt, Result) -> Result; -confuse_list(List, Cnt, Result) -> - Index = rand:uniform(Cnt), - {Element, NList} = extract_member(Index, List, []), - confuse_list(NList, Cnt - 1, [Element | Result]). - -confuse_list1(List) -> +confuseList(List) -> TupleList = list_to_tuple(List), TupleSize = tuple_size(TupleList), - confuse_list1(TupleSize, TupleSize, TupleList). + confuseList(TupleSize, TupleSize, TupleList). -confuse_list1(0, _TupleSize, TupleList) -> tuple_to_list(TupleList); -confuse_list1(Index, TupleSize, TupleList) -> +confuseList(0, _TupleSize, TupleList) -> tuple_to_list(TupleList); +confuseList(Index, TupleSize, TupleList) -> ChangeIndex = rand:uniform(TupleSize), Value1 = element(Index, TupleList), Value2 = element(ChangeIndex, TupleList), TupleList1 = setelement(Index, TupleList, Value2), TupleList2 = setelement(ChangeIndex, TupleList1, Value1), - confuse_list1(Index - 1, TupleSize, TupleList2). + confuseList(Index - 1, TupleSize, TupleList2). -confuse_list2(List) -> +confuseList2(List) -> Array = array:from_list(List), ArraySize = array:size(Array), - confuse_list2(ArraySize, ArraySize, Array). + confuseList2(ArraySize, ArraySize, Array). -confuse_list2(0, _TupleSize, TupleList) -> array:to_list(TupleList); -confuse_list2(Index, TupleSize, TupleList) -> +confuseList2(0, _TupleSize, TupleList) -> array:to_list(TupleList); +confuseList2(Index, TupleSize, TupleList) -> ChangeIndex = rand:uniform(TupleSize), Value1 = array:get(Index, TupleList), Value2 = array:get(ChangeIndex, TupleList), TupleList1 = array:set(Index, Value2, TupleList), TupleList2 = array:set(ChangeIndex, Value1, TupleList1), - confuse_list2(Index - 1, TupleSize, TupleList2). + confuseList2(Index - 1, TupleSize, TupleList2). %%根数Tuple元素数量,把List转成Tuple 返回:{TupleList, RemainList} list_to_tuple(List, TupleCount) ->