Acabo de ver una pregunta de código de golf sobre generating a sorted list of 100 random integers. Lo que vino a la cabeza, sin embargo, fue la idea de que se podría generar en lugar de una lista de los deltas positivos, y simplemente seguir sumando a un total acumulado, por lo tanto:¿Generar ordenadas aleatoriamente ordenadas sin el género? O (n)
deltas: 1 3 2 7 2
ints: 1 4 6 13 15
De hecho, se utiliza flotadores, a continuación, normalizar para adaptarse a un límite superior, y redondo, pero el efecto es el mismo.
Aunque no sería un código más corto, sin duda sería más rápido sin el paso de ordenación. Pero lo que no tengo en cuenta es esto: ¿La distribución resultante de los enteros sería la misma que generar 100 enteros aleatorios a partir de una función de densidad de probabilidad distribuida uniformemente?
Editar: un script de ejemplo:
import random,sys
running = 0
max = 1000
deltas = [random.random() for i in range(0,11)]
floats = []
for d in deltas:
running += d
floats.append(running)
upper = floats.pop()
ints = [int(round(f/upper*max)) for f in floats]
print(ints)
quién (tirada de los dados justo) de salida fue de:
[24, 71, 133, 261, 308, 347, 499, 543, 722, 852]
UPDATE:Alok's answer y Dan Dyer's comment punto de que el uso de un exponential distribution para los deltas daría una distribución uniforme de enteros.
Esto no será uniforme. Ver mi respuesta o la de Rupert Nash. –