Перетасовка списка в Mathematica

#wolfram-mathematica #shuffle

#wolfram-mathematica #перетасовка

Вопрос:

Какой наилучший / самый простой способ перетасовать длинный список в Mathematica?

Ответ №1:

 RandomSample[list]
  

Да, это действительно так просто. По крайней мере, начиная с версии 6.

До того, как RandomSample был введен, можно было бы использовать:

 #[[ Ordering[Random[] amp; /@ #] ]] amp; @ list
  

Комментарии:

1. До версии 6 я использовал Combinatorica'RandomPermutation , которая одновременно быстрее и безопаснее, поскольку она никогда не может создавать идентичные элементы.

2. @Leonid Szabolcs заявил: «В Combinatorica также есть функция случайной замены (более ранние версии). Я ищу другие / лучшие решения, если таковые имеются.» Я отвечал с учетом этого, но это действительно должно быть лучшим решением до версии 6.0.

3. Упс, пропустил это. Но тогда я не понимаю — решение, основанное на Combinatorica'RandomPermutation , кажется мне превосходным, зачем вообще беспокоиться об использовании Random основанного на нем (на самом деле это вопрос к @Szabolcs, а не к вам)?

4. @Leonid, я искал ответ для версии 8, где 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[] amp; /@ Range@n]]], n]

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

Другая проблема, помимо производительности, заключается в том, что если дважды выпадут одни и те же случайные значения (маловероятно, хотя и возможно), упорядочивание не приведет к получению этих двух значений в случайном порядке.

Комментарии:

1. Прошу прощения, но у вас там какой-то хитроумный код. (1) RandomReal[] amp; /@ Range@n может быть заменен на Random[] amp; /@ set или обычно быстрее RandomReal[1, Length@set] . (2) Take[... , n] здесь ничего не делает и может быть удален. Следовательно, код должен быть: set[[ Ordering@RandomReal[1, Length@set] ]]

2. На самом деле, использование RandomReal не имеет никакого смысла, поскольку оно было введено в версии 6 вместе с RandomSample . Следовательно, это наиболее целесообразно для предварительной версии-6 shuffle: #[[ Ordering[ Random[]amp; /@ # ] ]] amp;

Ответ №3:

В настоящее время я использую

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

Это для Mathematica 8. В Combinatorica также есть функция случайной замены (более ранние версии).

Я ищу другие / лучшие решения, если таковые имеются.