• Domingo 22 de Diciembre de 2024, 14:16

Autor Tema:  Duda con clases/atributos estáticos.  (Leído 1822 veces)

DanteInfernum666

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Duda con clases/atributos estáticos.
« en: Martes 2 de Abril de 2013, 03:25 »
0
¡Hola a todos! Antes que nada aviso que soy nuevo por estos lados, y espero que alguien pueda arrojarme un poco de luz...

Estoy siguiendo un curso de C#, y me encontré con la siguiente sentencia en un de sus ejemplos:

Código: [Seleccionar]
class Dado
    {
        private int valor;
        private static Random aleatorio;


¿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?

Les dejo el código completo:

Código: [Seleccionar]

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Dado
    {
        private int valor;
        private static Random aleatorio;

        public Dado()
        {
            aleatorio = new Random();
        }

        public void Tirar()
        {
            valor = aleatorio.Next(1, 7);
        }

        public void Imprimir()
        {
            Console.WriteLine("El valor del dado es:" + valor);
        }

        public int RetornarValor()
        {
            return valor;
        }
    }

    class JuegoDeDados
    {
        private Dado dado1, dado2, dado3;

        public JuegoDeDados()
        {
            dado1 = new Dado();
            dado2 = new Dado();
            dado3 = new Dado();
        }

        public void Jugar()
        {
            dado1.Tirar();
            dado1.Imprimir();
            dado2.Tirar();
            dado2.Imprimir();
            dado3.Tirar();
            dado3.Imprimir();
            if (dado1.RetornarValor() == dado2.RetornarValor() &&
                dado1.RetornarValor() == dado3.RetornarValor())
            {
                Console.WriteLine("Ganó");
            }
            else
            {
                Console.WriteLine("Perdió");
            }
            Console.ReadKey();
        }

        static void Main(string[] args)
        {
            JuegoDeDados j = new JuegoDeDados();
            j.Jugar();
        }
    }
}


Si quito la parte de <<static>> en <<private Random (static) aleatorio;>>, los tres dados siempre retornan el mismo valor. ¿Por qué pasa esto? ¿Por qué es necesario declarar la sentencia como estática para evitarlo?

¡Saludos!

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re:Duda con clases/atributos estáticos.
« Respuesta #1 en: Martes 2 de Abril de 2013, 06:05 »
0
Buenas DanteInfernum666, bienvenido al foro.

Tratare de responder tus dudas lo mejor posible.

Citar
¿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"

Citar
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.

Citar
¿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:

Código: [Seleccionar]
        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 :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

DanteInfernum666

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re:Duda con clases/atributos estáticos.
« Respuesta #2 en: Martes 2 de Abril de 2013, 18:32 »
0
¡Ahora sí! ¡Muchísimas gracias! Un lujo la explicación, quedó clarísimo.
La próxima vez tendré que investigar un poco más esto de las clases predeterminadas...