explorer, el método que propones tiene un problema, y es que los números que genera, en realidad, no son demasiado aleatorios. Además, en contra de lo que podría parecer, cuantas mas bolitas simulas, menos aleatorios son los números.
Para probarlo he hecho unas pequeñas modificaciones a tu
script para que acepte un número variable de bolitas y para que al final imprima también la desviación típica de los números generados:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict
;
use warnings
;
use diagnostics
;
my $bolitas = shift() || 1000;
my $ancho = shift() || 25; # El usuario nos pasa el tamaño o tomamos 25 por defecto
my @array = (0
) x
$ancho;
for (1
.. $bolitas) { # Tenemos algunas bolitas,
$array[ # que caen en un casillero,
rand $ancho # elegido al azar,
]++; # aumentando el número de bolitas en el casillero.
}
my $total = 0;
my $total2 = 0;
# print "Dato\tNúmero\n";
for my $i (0
.. $#array) {
my $v = $array[$i] / $bolitas;
# printf "%d\t%6.5f\n", $i, $v;
$total += $v;
$total2 += $v * $v;
}
printf " SUMA:\t%6.5f\n", $total;
printf "s:\t%6.5f\n", sqrt($total2 / $bolitas - ($total / $bolitas) ** 2
);
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Que al ejecutarlo para 10, 100, 1000, 10000 y 100000 da estos valores:
- Código: Seleccionar todo
$ perl bolitas.pl 10
SUMA: 1.00000
s: 0.04472
$ perl bolitas.pl 100
SUMA: 1.00000
$ perl bolitas.pl 1000
SUMA: 1.00000
s: 0.00631
$ perl bolitas.pl 10000
SUMA: 1.00000
s: 0.00200
$ perl bolitas.pl 100000
SUMA: 1.00000
s: 0.00063
Estadísticamente, los números siguen una distribución binomial, de
$media = 1 / $ancho y
varianza = 1/$ancho * (1 - 1/$ancho) / $bolitas, que tiende a cero cuando $bolitas crece.
La solución al problema no es fácil. Lo primero que hace falta es saber para qué se van a usar los números para a continuación buscar una distribución que se ajuste a ese uso y finalmente desarrollar un método que genere números según la misma.