【发布时间】:2011-05-09 10:32:59
【问题描述】:
在 Mathematica 中随机播放一长串列表的最佳/最简单方法是什么?
【问题讨论】:
标签: wolfram-mathematica shuffle
在 Mathematica 中随机播放一长串列表的最佳/最简单方法是什么?
【问题讨论】:
标签: wolfram-mathematica shuffle
RandomSample[list]
是的,就是这么简单。至少从第 6 版开始。
在引入RandomSample 之前,可能会使用:
#[[ Ordering[Random[] & /@ #] ]] & @ list
【讨论】:
Combinatorica'RandomPermutation,它更快更安全,因为它永远不会产生相同的元素。
Combinatorica'RandomPermutation 的解决方案似乎优于我,为什么还要使用基于Random 的解决方案(这真的是@Szabolcs 的问题,而不是你)?
在引入 RandomSample 之前,我已经大量使用了以下 MathGroup 函数,尽管 RandomSample 在我的机器上至少快了一个数量级。
In[128]:= n = 10;
set = Range@n
Out[129]= {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
In[130]:= Take[set[[Ordering[RandomReal[] & /@ Range@n]]], n]
Out[130]= {8, 4, 5, 2, 3, 10, 7, 9, 6, 1}
除了性能之外的另一个问题是,如果相同的随机实数被命中两次(虽然可能,但不太可能)排序不会以随机顺序给出这两个。
【讨论】:
RandomReal[] & /@ Range@n 可以替换为 Random[] & /@ set 或通常更快的 RandomReal[1, Length@set]。 (2) Take[... , n] 在这里没有做任何事情,可以被删除。因此,代码应为:set[[ Ordering@RandomReal[1, Length@set] ]]
RandomReal 没有任何意义,因为它是在版本6 中与RandomSample 一起引入的。因此,这对于 pre-version-6 shuffle 最有意义:#[[ Ordering[ Random[]& /@ # ] ]] &
目前我使用
list[[PermutationList@RandomPermutation@Length[list]]]
这适用于 Mathematica 8。Combinatorica 还具有 RandomPermutation 函数(早期版本)。
如果有的话,我正在寻找其他/更好的解决方案。
【讨论】: