【问题标题】:Shuffling a list in Mathematica在 Mathematica 中洗牌
【发布时间】:2011-05-09 10:32:59
【问题描述】:

在 Mathematica 中随机播放一长串列表的最佳/最简单方法是什么?

【问题讨论】:

    标签: wolfram-mathematica shuffle


    【解决方案1】:
    RandomSample[list]
    

    是的,就是这么简单。至少从第 6 版开始。

    在引入RandomSample 之前,可能会使用:

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

    【讨论】:

    • 在版本 6 之前,我使用的是 Combinatorica'RandomPermutation,它更快更安全,因为它永远不会产生相同的元素。
    • @Leonid Szabolcs 说:“Combinatorica 也有一个 RandomPermutation 函数(早期版本)。我正在寻找其他/更好的解决方案,如果有的话。”我的回答是考虑到这一点,但这确实应该是 6.0 之前的更好解决方案。
    • 糟糕,错过了那个。但后来我不明白 - 基于Combinatorica'RandomPermutation 的解决方案似乎优于我,为什么还要使用基于Random 的解决方案(这真的是@Szabolcs 的问题,而不是你)?
    • @Leonid,我正在寻找 v8 的答案,其中 Combinatorica 已被弃用并在加载时发出警告。对于早期版本,这很好。
    【解决方案2】:

    在引入 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}
    

    除了性能之外的另一个问题是,如果相同的随机实数被命中两次(虽然可能,但不太可能)排序不会以随机顺序给出这两个。

    【讨论】:

    • 请原谅,但那是你那里的一些狡猾的代码。 (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[]& /@ # ] ]] &
    【解决方案3】:

    目前我使用

    list[[PermutationList@RandomPermutation@Length[list]]]
    

    这适用于 Mathematica 8。Combinatorica 还具有 RandomPermutation 函数(早期版本)。

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

    【讨论】:

      猜你喜欢
      • 2012-05-09
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 2013-09-02
      相关资源
      最近更新 更多