challenge n人中m人が当選するくじ

n人の中から公平にm人を選ぶ、くじ引きプログラムを作ってください。

Posted feedbacks - Erlang

長さNのリストをシャッフルして、先頭からM個を取り出します。

1> c(n_m).
{ok,n_m}
2> n_m:n_m(10, 3).
[3,1,9]
3> n_m:n_m(10, 3).
[1,6,7]
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
-module(n_m).
-export([n_m/2]).

shuffle(List, 0) -> List;
shuffle(List, N) ->
        R = lists:nth(random:uniform(length(List)), List),
        L = [R | [X || X <- List, X =/= R]],
        shuffle(L, N - 1).

n_m(N, M) -> lists:sublist(shuffle(lists:seq(1, N), N), M).

Index

Feed

Other

Link

Pathtraq

loading...