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