Basta ya de indagar por todo internet ya que llegaste al espacio correcto, tenemos la solución que necesitas hallar sin complicaciones.
Solución:
Python, 89 bytes
from random import*
lambda n,k:[x-i for i,x in enumerate(sorted(sample(range(1,n+k),k)))]
Generando un creciente secuencia en lugar de una no decreciente uno sería sencillo: esto es solo un subconjunto aleatorio de k
números entre 1
y n
ordenado.
Pero podemos convertir una secuencia creciente en una no decreciente al reducir cada espacio entre números consecutivos en 1. Entonces, un espacio de 1 se convierte en un espacio de 0, haciendo números iguales. Para ello, disminuya la i
‘th mayor valor por i
r[0], r[1], ..., r[n-1] => r[0]-0, r[1]-1, ..., r[n-1]-(n-1)
Para que el resultado sea de 1
a n
la entrada debe ser de 1
a n+k-1
. Esto da una biyección entre secuencias no decrecientes de números entre 1
y n
a secuencias crecientes entre 1
y n+k-1
. La misma biyección se usa en el argumento de estrellas y barras para contar tales secuencias.
El código usa la función python random.sample
el cual toma k
muestras sin reemplazo de la lista de entrada. Ordenarlo da la secuencia creciente.
05AB1E, 13 bytes
+
¡Pruébelo en línea!
Explicación
+
Python, 87 bytes
from random import*
f=lambda n,k:k>random()*(n+k-1)and f(n,k-1)+[n]or k*[7]and f(n-1,k)
La probabilidad de que el valor máximo posible n
se incluye igual k/(n+k-1)
. Para incluirlo, colóquelo al final de la lista y disminuya los números necesarios restantes k
. Para excluirlo, disminuya el límite superior n
. Luego, repite hasta que no se necesiten más valores (k==0
).
de pitón random
no parece tener una variable de Bernoulli incorporada: 1 con alguna probabilidad y 0 en caso contrario. Entonces, esto verifica si un valor aleatorio entre 0 y 1 generado por random
cae por debajo k/(n+k-1)
. Python 2 haría la proporción como una división flotante, por lo que en su lugar multiplicamos por el denominador: k>random()*(n+k-1)
.
Calificaciones y comentarios
Si aceptas, tienes la libertad de dejar un ensayo acerca de qué te ha parecido esta crónica.