В Mathematica вы можете сделать что-то вроде
secretSanta[n_] :=
DeleteCases[Permutations[Range[n]], a_ /; Count[a - Range[n], 0] > 0]
, где n
- это количество людей в бассейне.Затем, например, secretSanta[4]
возвращает
{{2, 1, 4, 3}, {2, 3, 4, 1}, {2, 4, 1, 3}, {3, 1, 4, 2}, {3, 4, 1, 2},
{3, 4, 2, 1}, {4, 1, 2, 3}, {4, 3, 1, 2}, {4, 3, 2, 1}}
Редактировать
Похоже, что пакет Combinatorica
в Mathematica на самом деле имеет функцию Derangements
, так что вы можететакже сделайте что-то вроде
Needs["Combinatorica`"]
Derangements[Range[n]]
, хотя в моей системе Derangements[Range[n]]
примерно в 2 раза медленнее, чем функция выше.