並列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.