Buenas DanteInfernum666, bienvenido al foro.
Tratare de responder tus dudas lo mejor posible.
¿Qué es "private static Random aleatorio;"? ¿Un atributo estático de la clase "Dado"? (si es que existe eso...) ¿Otra clase estática llamada Random?
R.- Es un atributo estatico perteneciente a la clase "Dado"
Si quito la parte de <<static>> en <<private Random (static) aleatorio;>>, los tres dados siempre retornan el mismo valor. ¿Por qué pasa esto?
R.- Esto no tiene que ver con que el atributo sea estatico o no, mas bien tiene que ver en como funciona la clase Random().
La clase Random() no genera numeros aleatorios verdaderos, sino lo que se conoce como "Pseudo aleatorios", o sea, que en realidad se generan a partir de un valor seed (semilla), y esto es asi para facilitar la depuracion, ya que de esa manera garantizas que siempre se genere la misma secuencia de numeros aleatorios, sin importar cuantas veces ejecutes tu programa.
Cuando llamas a la funcion Random() sin parametros, internamente utilizas la misma semilla, que esta basada en el numero de milisegundos que han pasado desde que encendiste tu computadora, y este valor no cambia a menos que esperes el tiempo suficiente para que la semilla sea diferente.
Cuando declaras el atributo de tipo estatico, lo que sucede es que en lugar de inicializar Random con una semilla diferente, estas diciendole que use la misma semilla pero que genere el siguiente numero aleatorio de la secuencia.
¿Por qué es necesario declarar la sentencia como estática para evitarlo?
R.- No es necesario, lo que si seria necesario es hacer que el proceso se "detenga" hasta que pase x numero de milisegundos, y de esa forma garantizas que se utiliza una semilla diferente para Random()
Haz la sigueinte modificacion, y veras que ahora si se genera un aleatorio diferente aunque definas aleatorio como no estatico:
private int valor;
private Random aleatorio;
public Dado()
{
// Esperas un milisegundo para que la semilla
// de Random sea diferente la proxima vez
System.Threading.Thread.Sleep(1);
aleatorio = new Random();
}
Saludos