並列bogosort
30分プログラム、その363。id:mzp:20080825:shuffleの続きとして、bogosortをやってみる。
せっかくErlangなので並列バージョンも作ってみたけど、微妙。計算が終了したあとも余計なプロセスを殺してないので、余計なメッセージが飛んでくる。
使い方
1> Xs = shuffle:shuffle(lists:seq(1,5)). [1,3,5,2,4] 2> bogosort:multibogo(Xs,3). {1,[1,2,3,4,5]}
ソースコード
-module(bogosort). -compile([export_all]). is_sorted([X,Y|_]) when X > Y -> false; is_sorted([_|Ys]) -> % X <= Y is_sorted(Ys); is_sorted(_) -> true. init()-> shuffle:init(). bogosort(Xs)-> Ys = shuffle:shuffle(Xs), case is_sorted(Ys) of true -> Ys; _ -> bogosort(Xs) end. multibogo(Xs,N) -> Self = self(), Pids = lists:map(fun(M) -> spawn(fun()-> Self ! {M,bogosort(Xs)} end) end, lists:seq(1,N)), receive X -> X end.