diff --git a/src/comMisc/utList.erl b/src/comMisc/utList.erl index 5060626..1736694 100644 --- a/src/comMisc/utList.erl +++ b/src/comMisc/utList.erl @@ -136,6 +136,60 @@ extract_member(1, List1, List2) -> extract_member(Nth, [R | List1], List2) -> extract_member(Nth - 1, List1, List2 ++ [R]). +%% ---------------------------------------------------- +%% @doc +%% 打乱列表函数 +%% @end +%% ---------------------------------------------------- +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]). + +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, [R | List2]). + +confuse_list1(List) -> + TupleList = list_to_tuple(List), + TupleSize = tuple_size(TupleList), + confuse_list1(TupleSize, TupleSize, TupleList). + +confuse_list1(0, _TupleSize, TupleList) -> tuple_to_list(TupleList); +confuse_list1(Index, TupleSize, TupleList) -> + Index1 = rand:uniform(TupleSize), + Index2 = rand:uniform(TupleSize), + Value1 = element(Index1, TupleList), + Value2 = element(Index2, TupleList), + TupleList1 = setelement(Index1, TupleList, Value2), + TupleList2 = setelement(Index2, TupleList1, Value1), + confuse_list1(Index - 1, TupleSize, TupleList2). + +confuse_list2(List) -> + Array = array:from_list(List), + ArraySize = array:size(Array), + confuse_list2(ArraySize, ArraySize, Array). + +confuse_list2(0, _TupleSize, TupleList) -> array:to_list(TupleList); +confuse_list2(Index, TupleSize, TupleList) -> + Index1 = rand:uniform(TupleSize), + Index2 = rand:uniform(TupleSize), + Value1 = array:get(Index1, TupleList), + Value2 = array:get(Index2, TupleList), + TupleList1 = array:set(Index1, Value2, TupleList), + TupleList2 = array:set(Index2, Value1, TupleList1), + confuse_list2(Index - 1, TupleSize, TupleList2). + %%根数Tuple元素数量,把List转成Tuple 返回:{TupleList, RemainList} list_to_tuple(List, TupleCount) -> list_to_tuple(List, TupleCount, []).