次のようなリストがあります。
L = [[1,2,3],[4,5,6,7,8],[9,10,11]]
次のように、要素をランダムに選択したい:
L1=[[1,2,3],[9,10,11]]
L2=[[1,2,3]]
L3=[[4,5,6,7,8],[9,10,11]]
L4=[[1,2,3]]
どうすればerlangでそれを行うことができますか?
編集:すべての要素が少なくとも 1 回選択されることも保証したいと思います。
あなたがやろうとしているのは、リスト[A, B, C, D, E]
を取得して要素のランダムな選択を選択することのように聞こえるので、取得する場合もあれば、取得する場合もあれば、単に[A, C, E]
を取得する場合もあります。要素自体がリストであるという事実は、あなたが与えた例では重要なようです。[B, C]
[E]
基本的に、アイデアは、確率 P で各要素を個別に選択することです。これは、各要素に乱数を割り当て、それが P より小さいかどうかを確認することと同じです。ほとんどの場合、P = 0.5 の場合、各要素には当選確率50/50。
だから、これであなたの問題は解決すると思います。
random_subset(List) -> random_subset(List, 0.5).
random_subset(List, P) ->
% Need to seed the random number generator
{S1,S2,S3} = now(),
random:seed(S1, S2, S3),
% Assign a random value for each element in the list.
Selections = [{E, random:uniform()} || E <- List],
% Only keep elements where the random value is in the selected range
[E || {E, RandomValue} <- Selections, RandomValue < P].
これをもっとコンパクトに書く方法はありますが、何が起こっているかの各ステップを説明するために長い道のりを書きました. これを行うより簡単な方法は、lists:filter/2を使用することです:
random_subset(List, P) ->
% Note: assuming the random number generator has already been seeded
lists:filter(fun(_) -> random:uniform() < P end, List).
randomモジュールを使用して、L からランダムに選択されたアイテムを含むランダムな長さの新しいリストを生成し、必要に応じて重複を排除できます。