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! 