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

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.

[quote=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.[/quote]

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

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.

[code]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();
} [/code]

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

Opa!

Valeu gente, funcionou direitinho! :smiley: