2011-05-09 254 views

回答

21
RandomSample[list] 

是的,其实很简单。在自6

之前RandomSample引入版本至少,一个可以使用:

#[[ Ordering[Random[] & /@ #] ]] & @ list 
+1

在版本6之前,我使用'Combinatorica'RandomPermutation',它既快速又安全,因为它永远不会产生相同的元素。 – 2011-05-11 19:24:09

+0

@Leonid Szabolcs表示:“Combinatorica也具有RandomPermutation功能(早期版本)。 我正在寻找其他/更好的解决方案,如果有的话。”我在回答这个问题,但这应该是6.0以前的更好解决方案。 – 2011-05-11 21:19:30

+0

糟糕,错过了那一个。但后来我不明白 - 基于'Combinatorica'RandomPermutation'的解决方案似乎比我更优秀,为什么还要使用基于Random的方法(这是对@Szabolcs的问题,而不是你)? – 2011-05-11 21:22:53

1

目前我使用

list[[[email protected]@Length[list]]] 

这是数学8 Combinatorica还具有RandomPermutation功能(早期版本)。

我正在寻找其他/更好的解决方案,如果有的话。

2

RandomSample介绍之前,我已经使用了下面MathGroup功能严重,虽然RandomSample至少快一个在我的机器上的大小。

In[128]:= n = 10; 
      set = [email protected] 

Out[129]= {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 

In[130]:= Take[set[[Ordering[RandomReal[] & /@ [email protected]]]], n] 

Out[130]= {8, 4, 5, 2, 3, 10, 7, 9, 6, 1} 

除了性能的其他问题是,如果相同的随机实数被击中两次(不可能的,尽管可能)排序不会以随机顺序给予这两个。

+0

对不起,但那是你在那里的一些狡猾的代码。 (1)'RandomReal []&/ @ Range @ n'可以替换为Random []&/ @ set'或通常更快的'RandomReal [1,Length @ set]'。 (2)'拿[...,n]'在这里没有做任何事情,可以删除。因此,代码应该是:'set [[Ordering @ RandomReal [1,Length @ set]]]' – 2011-05-10 15:28:08

+0

实际上,使用'RandomReal'没有任何意义,因为它是在版本6中与'RandomSample'一起引入的, 。因此,这对于版本6之前的shuffle是最有意义的:'#[[Ordering [Random []&/ @#]]]&' – 2011-05-10 15:56:46