我有這樣一個清單:我怎麼可以指定列表中元素的隨機數到一個新的列表
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中做到嗎?
編輯: 我也想保證所有元素至少會被選中一次。
我有這樣一個清單:我怎麼可以指定列表中元素的隨機數到一個新的列表
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中做到嗎?
編輯: 我也想保證所有元素至少會被選中一次。
您可以使用random模塊生成一個隨機長度的新列表,其中包含從L中隨機選擇的項目,如果需要,可以消除重複項目。
這聽起來像你試圖做的是採取列表[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).
對不起,我在結果中看不到圖案。 L4是什麼?嘗試描述你想用文字來代替實例,這可能甚至會導致你自己的解決方案... – MartinStettner
@MartinStettner對不起,感謝您的建議。 – Sina
檢查了這一點:http://stackoverflow.com/q/8817171/431620 –