He calculado el tamaño medio de cada uno de los 24 cubos de más de 100 ensayos para cada uno de los algoritmos propuestos aquí. Pensé que era interesante que tres de las cuatro parecen dar como resultado 20010/24 artículos por cubo en promedio, pero el método ingenuo que describí converge a ese promedio más rápidamente. Esto tiene un sentido intuitivo para mí. Ese método es algo así como nevar aleatoriamente en 24 cubos, y por lo tanto es probable que resulte en cubos que son aproximadamente del mismo tamaño. Los otros son más como piratear al azar en una longitud de madera.
Bevan: [751, 845, 809, 750, 887, 886, 838, 868, 837, 902, 841, 812, 818, 774, 815, 857, 752, 815, 896, 872, 833, 864, 769, 894]
Gregory: [9633, 5096, 2623, 1341, 766, 243, 159, 65, 21, 19, 16, 4, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2]
mjv: [895, 632, 884, 837, 799, 722, 853, 749, 915, 756, 814, 863, 842, 642, 820, 805, 659, 862, 742, 812, 768, 816, 721, 940]
peterallenwebb: [832, 833, 835, 829, 833, 832, 837, 835, 833, 827, 833, 832, 834, 833, 836, 833, 838, 834, 834, 833, 834, 832, 836, 830]
Y aquí es el código Python: importación aleatoria
N = 20010;
def mjv():
gaps = [ random.randrange(0, N) for i in range(0, 24) ]
gaps = gaps + [0, N]
gaps.sort()
value = [ gaps[i+1] - gaps[i] for i in range(0, 24) ]
return value
def gregory():
values = []
remainingPortion = N
for i in range(0, 23):
val = random.randrange(1, remainingPortion - (23 - i))
remainingPortion = remainingPortion - val
values.append(val)
values.append(remainingPortion)
return values
def peterallenwebb():
values = [0 for i in range(0, 24) ]
for i in range(0, N):
k = random.randrange(0, 24)
values[k] = values[k] + 1
return values
def bevan():
values = [];
sum = 0.0
for i in range(0, 24):
k = random.random()
sum = sum + k
values.append(k);
scaleFactor = N/sum
for j in range(0, 24):
values[j] = int(values[j] * scaleFactor)
return values
def averageBucketSizes(method):
totals = [0 for i in range(0, 24)]
trials = 100
for i in range(0,trials):
values = method()
for j in range(0, 24):
totals[j] = totals[j] + values[j]
for j in range(0, 24):
totals[j] = totals[j]/trials
return totals;
print 'Bevan: ', averageBucketSizes(bevan)
print 'Gregory: ', averageBucketSizes(gregory)
print 'mjv: ', averageBucketSizes(mjv)
print 'peterallenwebb: ', averageBucketSizes(peterallenwebb)
Avísame si hay algún error. Voy a volver a correr.
¿Puede explicar esto un poco más? – BobbyShaftoe
Creo que ==> Toma el valor 20010 y divídelo aleatoriamente en 24 valores separados, de modo que al sumarlos obtengas el valor original. – Gregory