如何从mathematica中的列表中选择统一的随机和唯一元素

时间:2011-06-09 21:34:54

标签: wolfram-mathematica

我有一段时间没有这个问题。只是想知道这样做的最佳方式(效率和优雅)是什么。我能想到的方法是使用RandomPermutation随机化列表的索引,然后从列表中选择第一个m(当然需要小于列表的长度)元素。但这需要Combinatorica包。

有更好的选择吗?

谢谢。

4 个答案:

答案 0 :(得分:6)

喔。结果证明(自版本6以来)Mathematica将为您做到:RandomSample[list, m]

答案 1 :(得分:4)

如Jefromi所述,对于MMA6及以上RandomSample将会这样做。对于低于6的版本,您可以使用Combinatorica包中的RandomPermutation函数(这与MMA8函数RandomPermutation完全不同):

list[[ Take[RandomPermutation[Length[list]],m] ]]

答案 2 :(得分:1)

好吧,因为它内置了无意义,但这里是如何实现Jefromi所建议的:

ClearAll@getel;
getel[{els_, lst_}] := Module[
{pos = RandomInteger[{1, Length@lst}]},
{els~Join~{lst\[LeftDoubleBracket]pos\[RightDoubleBracket]}, 
  Delete[lst, pos]}]

ClearAll@getN;
getN[lst_, n_] := First@Nest[getel, {{}, lst}, n]

和用法:getN[Range[10000], 3000]。仅比内置功能慢4个数量级......

答案 3 :(得分:0)

这个怎么样?

s={{{3, 1}}, {{3, 2}}, {{4, 2}}, {{5, 1}}, {{5, 2}}}

i = 1;
j = 1;
rand[list_] := Drop[
list,
Flatten[
Position[list,   var[i++] = {Flatten[RandomSample[list, 1]]}     ]]
]

Table[var[j++], {Length[s]}]

这会产生s的随机排列,没有重复:

{{{5, 2}}, {{3, 1}}, {{5, 1}}, {{4, 2}}, {{3, 2}}}