リストの要素のシャッフル
30分プログラム、その355。bogo sortをやろうと思ったら、シャッフルするための関数がなかったので、そちらから。
リストの要素をいれかえるのは思い気がしたので、いったん配列に変換するようにしてみた。
Erlangの配列は破壊的じゃないんだ。
使い方
1> shuffle:shuffle(lists:seq(1,10)). [4,7,10,8,5,9,6,3,1,2] 2> shuffle:shuffle(lists:seq(1,10)). [6,9,5,8,3,2,7,4,10,1] 3> shuffle:shuffle(lists:seq(1,10)). [1,9,2,7,3,4,10,6,8,5]
ソースコード
-module(shuffle). -export([init/0,shuffle/1]). rand(From,To) -> random:uniform(To-From) + From - 1. swap(I,J,Xs) -> T = array:get(I,Xs), Ys = array:set(I,array:get(J,Xs),Xs), array:set(J,T,Ys). shuffle(Xs) -> Ys = array:from_list(Xs), Size = array:size(Ys), array:to_list( lists:foldl(fun (I,Zs)-> J = rand(I,Size), swap(I,J,Zs) end, Ys, lists:seq(0,Size-1))). init()-> {A1,A2,A3} = now(), random:seed(A1, A2, A3).