Crear números aleatorios con C#

El último post de 2017 fue una pequeña píldora, y el primero de 2018 no podía ser distinto.

A primera vista, crear un número aleatorio puede parecer algo muy sencillo de hacer con C#, ya que tenemos una clase para ello:

https://msdn.microsoft.com/es-es/library/system.random(v=vs.110).aspx

Pero hay que tener una serie de cosas en cuenta para no equivocarnos y creer que estamos generando número aleatorios cuando no es así.

La clase Random no genera números aleatorios, son en realidad “pseudo-aleatorios” ya que dependen de una “semilla” de inicialización. Si no le decimos nada, esta semilla la obtiene automáticamente de la hora del sistema. Por lo tanto, podríamos inicializar la clase random de la siguiente manera:

Para mostrar algunos errores que se pueden cometer al usar Random veamos como se comporta este código, que a primeras puede parecer un buen generador de número aleatorios:

El resultado que nos da es:

No parece muy aleatorio este resultado, ¿verdad?

Como he comentado antes, es importante la semilla con la que inicializamos el Random, ya que de ella dependerá el resultado final, en este caso, aunque estamos generando una nueva instancia de Random en cada iteración, como la semilla no cambia, nos esta generando siempre el mismo número.

Veamos pues como podríamos hacer esto un poco mejor:

Y el resultado:

Un poco mejor. Ahora ya parece mas aleatorio. En este caso he generado una única instancia de Random y lo que hago es ir llamando a Next en cada una de las iteraciones. Mucho cuidado con esto, por que como has comprobado, la diferencia es grande.

Si tienes que generar varios números aleatorios asegúrate de crear una única instancia de Random e ir llamando a Next cada vez.

Por otro lado, el otro día probé con un método que genera una semilla distinta no basada en el reloj del sistema que funciona bastante bien, e incluso generando un nuevo Random en cada itearicón me da resultados aleatorios:

Y el resultado:

Otra cosa con la que hay que tener cuidado es con los valores de rango a generar con Next, que es el método para devolver el número entero aleatorio. Existen tres sobrecargas del método:

next

Y la que más se suele usar es pasando un valor máximo, o pasando un mínimo y un máximo.

Aquí donde hay que fijarse es en la definición que dice:

Devuelve un entero aleatorio no negativo que es menor que el valor máximo especificado.

Hay que hacer hincapié en lo de menor que el valor máximo.

Por lo tanto en mi ejemplo anterior, se devolverá un valor entre 0 y 99. ¡Cuidado con esto que puede ser causa de errores!

Esta entrada fue publicada en Píldora, Programación y etiquetada , , , . Guarda el enlace permanente.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *