我有一个列表:
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中做到这一点?
编辑: 我还要保证所有元素至少会被选中一次。
答案 0 :(得分:2)
听起来你正在尝试做的就是选择一个列表[A, B, C, D, E]
然后选择一个随机选择的元素,所以有时你会得到[A, C, E]
,有时你会得到[B, C]
[E]
1}},其他时间仅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].
等。在您给出的示例中,元素本身列表的事实似乎并不重要。
基本上,我们的想法是以一定的概率P单独选择每个元素,这相当于为每个元素分配一个随机数,然后检查它是否小于P.最有可能的是,P = 0.5,对于你的情况 - 每个元素有50/50的机会被选中。
所以,我认为这可以解决你的问题。
random_subset(List, P) ->
% Note: assuming the random number generator has already been seeded
lists:filter(fun(_) -> random:uniform() < P end, List).
有更简洁的方法可以写这个,但我做了很长的路来解释正在发生的每一步。更简单的方法是使用lists:filter/2:
{{1}}
答案 1 :(得分:0)
您可以使用random模块生成包含从L中随机选择的项目的随机长度的新列表,如有必要,可以删除重复项。