2011-05-09 256 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