2012-11-27 13 views
-1

我有這樣一個清單:我怎麼可以指定列表中元素的隨機數到一個新的列表

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

對不起,我在結果中看不到圖案。 L4是什麼?嘗試描述你想用文字來代替實例,這可能甚至會導致你自己的解決方案... – MartinStettner

+0

@MartinStettner對不起,感謝您的建議。 – Sina

+0

檢查了這一點:http://stackoverflow.com/q/8817171/431620 –

回答

0

您可以使用random模塊生成一個隨機長度的新列表,其中包含從L中隨機選擇的項目,如果需要,可以消除重複項目。

2

這聽起來像你試圖做的是採取列表[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). 
+0

感謝您的回答,這是我想要的,堅果我也想保證所有的元素,將被選中至少一次。我怎樣才能做到這一點? – Sina

+0

你是什麼意思「至少一次」?你是否說你還想要一個隨機數量的子集,並且每個元素至少出現一個子集?最簡單的修改方法是首先生成隨機數量的子集,比如說N.然後,在生成最後一個子集時,查找尚未包含的任何數據(通過列表:member或other),然後更改元素的P值爲1。 – Tadmas

相關問題