如何将列表元素的随机数分配给新列表

时间:2012-11-27 20:45:36

标签: list erlang

我有一个列表:

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中做到这一点?

编辑: 我还要保证所有元素至少会被选中一次。

2 个答案:

答案 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中随机选择的项目的随机长度的新列表,如有必要,可以删除重复项。