A continuación se muestra el código de Mathematica basado en la respuesta de Igor Pak. Para obtener una permutación aleatoria hacia abajo en $[n]$ Comienza por elegir la primera entrada $p_1$ con la probabilidad adecuada; a continuación, elija al azar una permutación ascendente-descendente de tamaño $n-1$ de las permutaciones arriba-abajo con la primera entrada $< p_1$ y luego los une (incrementando las entradas $\ge p_1$ en la permutación arriba-abajo).
Para implementar este método, en realidad necesitamos un código que genere una permutación aleatoria de downup con la primera entrada $\ge$ un número determinado $k$ y el código siguiente lo hace. Utiliza la operación ComplementPermutation para intercambiar permutaciones updown y downup.
(* e[n,k] es el número Entringer *)
e[0,0] = 1;
e[n_,0]/;n>=1 := 0;
e[n_,k_]/;k>n || k<0 := 0
e[n_,k_] := e[n,k] = e[n,k-1] + e[n-1,n-k]
ComplementoPermutación[perm_] := Módulo[{n=Longitud[perm]}, n+1-perm];
incrementSpecifiedAndUp[perm_,k_]:=perm/.{i_/;i>=k :> i+1};
partialSums[list_] := Drop[FoldList[Plus,0,list],1];
RandomUpDownPermFirstEntryAtMostk[n_,k_]/;k==n :=
RandomUpDownPermFirstEntryAtMostk[n,n-1];
RandomUpDownPermFirstEntryAtMostk[n_,k_]/;1<=k<n :=
ComplementoPermutación[RandomDownUpPermFirstEntryAtLeastk[n,n+1-k]]
RandomDownUpPermFirstEntryAtLeastk[1,1]={1}; RandomDownUpPermFirstEntryAtLeastk[2,2]={2,1};
RandomDownUpPermFirstEntryAtLeastk[n_,k_]/; n>=3 && 2<=k<=n := Módulo[{claves,m,i,primeraEntrada,restoDePerm},
(* elige la primera entrada utilizando la distribución Entringer *)
keys=partialSums[Table[e[n-1,j],{j,k-1,n-1}]];
m=Random[Integer,{1,Last[keys]}];
i=1;
While[Not[ m<=keys[[i]] ],i=i+1];
primeraEntrada=k-1+i;
(* elegir restOfPerm uniformemente de updowns con su primera entrada < primeraEntrada *)
restOfPerm=RandomUpDownPermFirstEntryAtMostk[n-1,k-2+i];
(* amalgamar firstEntry y restOfPerm *)
Join[{primeraEntrada},incrementSpecifiedAndUp[restoDePerm,primeraEntrada]] ]
RandomDownUpPerm[1]={1};
RandomDownUpPerm[n_]/;n>=2 := RandomDownUpPermFirstEntryAtLeastk[n,2]
Muestra de salida:
In[264]:=RandomDownUpPerm[15]
Out[264]=
{8, 2, 4, 1, 15, 6, 7, 3, 10, 9, 13, 11, 14, 5, 12}