[Dúvida] O Random tá maluco! (C#)

3 respostas
Nicolas_Fernandes

Olá, galera do GUJ!

Tudo bem??

Estava eu em meus estudos de C#, quando me deparei com a seguinte dúvida:

Esta é minha classe de Cálculos Básicos:

public sealed class CalculosBasicos {

      private CalculosBasicos() { }

      private static CalculosBasicos instance = null;
      public static CalculosBasicos getInstance() {

         if (instance == null) instance = new CalculosBasicos();

         return instance;
      }

      public String GerarValorAtributo() {

         return new Random().Next(8, 19).ToString();
      }
}

Como perceberam, existe um método que retornará um valor randômico entre 8 e 19!

Agora, a minha View:

private void gerarPersonagemButton_Click(object sender, EventArgs e) {

         baseForTextBox.Text = CalculosBasicos.getInstance().GerarValorAtributo();
         baseDesTextBox.Text = CalculosBasicos.getInstance().GerarValorAtributo();
         baseConTextBox.Text = CalculosBasicos.getInstance().GerarValorAtributo();
}

A princípio, o correto seria que retornasse valores diferentes toda vez em que gerasse um randômico, mas sempre retornam valores iguais!

Alguém sabe qual a bobeira que eu estou fazendo? ^^"

Desde já, grato!

Nícolas Fernandes.

3 Respostas

rodrigo.bossini

Nicolas Fernandes:
Olá, galera do GUJ!

Tudo bem??

Estava eu em meus estudos de C#, quando me deparei com a seguinte dúvida:

Esta é minha classe de Cálculos Básicos:

public sealed class CalculosBasicos {

      private CalculosBasicos() { }

      private static CalculosBasicos instance = null;
      public static CalculosBasicos getInstance() {

         if (instance == null) instance = new CalculosBasicos();

         return instance;
      }

      public String GerarValorAtributo() {

         return new Random().Next(8, 19).ToString();
      }
}

Como perceberam, existe um método que retornará um valor randômico entre 8 e 19!

Agora, a minha View:

private void gerarPersonagemButton_Click(object sender, EventArgs e) {

         baseForTextBox.Text = CalculosBasicos.getInstance().GerarValorAtributo();
         baseDesTextBox.Text = CalculosBasicos.getInstance().GerarValorAtributo();
         baseConTextBox.Text = CalculosBasicos.getInstance().GerarValorAtributo();
}

A princípio, o correto seria que retornasse valores diferentes toda vez em que gerasse um randômico, mas sempre retornam valores iguais!

Alguém sabe qual a bobeira que eu estou fazendo? ^^"

Desde já, grato!

Nícolas Fernandes.

Você não tem que usar sempre o mesmo objeto random pra gerar os números?

ViniGodoy

A classe Random() gera numeros pseudo-aleatórios. Ou seja, objetos randoms diferentes, inicializados com a mesma semente, irão gerar a mesma sequencia de números. Se você não especificar a semente, o timer do sistema operacional será usado. Para três comandos seguidos, há altas chances desse valor de timer ser o mesmo.

Para resolver o problema, crie o random uma única vez, e deixe que ele pegue 3 números randomicos consecutivos.

public sealed class CalculosBasicos {  
   private CalculosBasicos() { }  
      private static readonly Random RANDOM = new Random();
      private static readonly CalculosBasicos INSTANCE = new CalculosBasicos();  

      public static CalculosBasicos Instance {
         get {
            return INSTANCE;
         }
      }
   
      public String GerarValorAtributo() {  
         return RANDOM.Next(8, 19).ToString();  
      }  
}  

private void gerarPersonagemButton_Click(object sender, EventArgs e) {  
   baseForTextBox.Text = CalculosBasicos.Instance.GerarValorAtributo();  
   baseDesTextBox.Text = CalculosBasicos.Instance.GerarValorAtributo();  
   baseConTextBox.Text = CalculosBasicos.Instance.GerarValorAtributo();  
}

Esse mesmo problema ocorre com a classe Random do Java, ou com qualquer gerador de números pseudo-aleatórios.

Nicolas_Fernandes

Opa!

Valeu gente, funcionou direitinho! :smiley:

Criado 19 de novembro de 2009
Ultima resposta 19 de nov. de 2009
Respostas 3
Participantes 3