#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 также есть функция случайной замены (более ранние версии).
Я ищу другие / лучшие решения, если таковые имеются.