erlang乱序一个List的方案
do2(L) -> do2(L,[]).do2([],L) -> L;do2(L1,L2) -> %io:format("L1=~w L2=~w~n",[L1,L2]), Len = length(L1), if Len > 1 -> NL = lists:split(random:uniform(Len-1), L1), {[H1|T1],[H2|T2]} = NL, NL2 = lists:flatten([T1],[H1|T2]), L11 = lists:append(L2,[H2]), do2(NL2, L11); true -> do2([],lists:append(L2,L1)) end.其结果为:128> c(shuffle).{ok,shuffle}129> shuffle:do2(lists:seq(0,9)).[9,2,5,1,8,0,7,3,6,4]130> shuffle:do2(lists:seq(0,9)).[8,3,6,5,7,4,9,0,2,1]131> shuffle:do2(lists:seq(0,9)).[5,3,7,8,1,9,0,6,2,4]132> shuffle:do2(lists:seq(0,9)).[3,0,5,2,1,6,8,4,9,7]133>
有几点值得思考的,关于这两种方案,是否是真正的洗牌算法。每个数字出现在某个位置是否等概率呢。
还有其它的方法不,欢迎探讨。