Anda di halaman 1dari 7

Gerando nmeros aleatrios C#

09/06/2012Alan RossiDeixe um comentrioIr para os comentrios

Gerar nmeros aleatrios (ou randmicos) na linguagem C# simples : basta usar a classe Random. Na definio da MSDN esta classe representa um gerador de nmeros pseudoaleatrio, um dispositivo que produz uma sequncia de nmeros que atendem a certos requisitos estatsticos para aleatoriedade. Esses nmeros pseudoaleatrio so escolhidos com probabilidade igual a partir de um conjunto finito de nmeros. Os nmeros escolhidos no so completamente aleatrios, porque um algoritmo matemtico definido usado para selecion-los, mas so suficientemente aleatrios para fins prticos. Gerao de nmeros aleatrios comea a partir de um valor de semente (seed) . Se a mesma semente for usada repetidamente, a mesma srie de nmeros ser gerada. Uma maneira de produzir diferentes seqncias fazer com que o valor de semente seja dependente do tempo, produzindo assim uma srie diferente com cada nova instncia de Random. Por padro, o construtor sem parmetros da classe Random usa o relgio do sistema para gerar o valor de semente. Obs: Como o relgio tem uma resoluo finita, usando o construtor sem parmetros para criar diferentes objetos Random em sucesso seguida cria geradores de nmeros aleatrios que produzem idnticas seqncias de nmeros aleatrios. O exemplo mais simples que podemos mostra na linguagem C# para gerar nmeros aleatrios dado abaixo: Random randNum = new Random(); randNum.Next(); A classe Random esta no namespace System Criamos o objeto randNum da classe Random e usamos o mtodo Next() que retorna um nmero inteiro aleatrio. Vamos mostrar isso na prtica criando um novo projeto no Visual C# 2010 Express Edition chamado NumerosAleatrios; No formulrio padro form1.cs vamos incluir um controle ListBox (listaResultado) e um controle Button (btnGeraNumeros);

No evento Click do boto de comando vamos incluir o cdigo: private void btnGeraNumeros_Click(object sender, EventArgs e) { Random randNum = new Random(); for (int i = 0; i <= 10; i++) listaResultado.Items.Add(randNum.Next()); } O mtodo Next() que retorna um nmero aleatrio no negativo. Executando o projeto obtemos os 11 nmeros aleatrios usando o mtodo Next() que retorna um nmero aleatrio no negativo. Voc pode obter mais controle sobre os nmeros gerados como gerar nmeros entre uma intervalo de valores. Vamos supor que voc deseja gerar nmeros menor que 100. Para isso basta alterar o cdigo incluindo o nmero 100 como parmetro do mtodo Next(); private void btnGeraNumeros_Click(object sender, EventArgs e) { Random randNum = new Random(); for (int i = 0; i <= 10; i++) listaResultado.Items.Add(randNum.Next(100)); } Isso ir gerar nmeros no maiores que 100 (inclusive).Abaixo temos o resultado da execuo :

O mtodo Next(Int32) Retorna um nmero aleatrio no-negativo menor do que o mximo especificado. E se voc precisar gerar nmeros entre um intervalo de nmeros ? Sem problemas. Use o mtodo Next(int1, int2). Este mtodo retorna um nmero aleatrio dentro de um intervalo especificado. Inclua outro controle Button(btnGerarNumerosNext2) no formulrio e no seu evento Click digite o cdigo a seguir: private void btnGerarNumerosNext2_Click(object sender, EventArgs e) { Random randNum = new Random(); for (int i = 0; i < 10; i++) listaResultado.Items.Add(randNum.Next(100,200)); } O cdigo acima ir gerar nmeros aleatrios entre 100 e 200. Executando o cdigo acima teremos:

O mtodo Next(minimo,maximo) gera nmero aleatrios no intervalo definido. Como ja foi dito, no construtor padro do objeto Random(), ser gerada uma semente de forma automtica, baseada na hora atual do sistema, mas voc pode definir uma semente para gerao dos nmeros indicando no construtor da classe Random; Inclua um novo controle Button no formulrio com o nome btnGerarNumerosComSeed e inclua no evento Click deste boto o cdigo abaixo: private void btnGerarNumerosComSeed_Click(object sender, EventArgs e) { Random randNum = new Random(2012);

for (int i = 0; i <= 10; i++) listaResultado.Items.Add(randNum.Next()); } No cdigo acima definimos o valor 2012 como semente para gerao dos nmeros aleatrios e a cada execuo do mtodo Next() teremos a gerao de um nmero diferente baseado nesta semente:

O construtor da classe Random(inteiro) permite definir uma semente para gerao de nmeros aleatrios. Esteja atento ao fato de que se voc gerar a mesma semente novamente a mesma sequncia de nmeros ser gerada. Teste isso interrompendo o programa e executando-o novamente, voc ver que a mesma sequncia ser gerada. Se voc precisar gerar nmeros aleatrios entre 0 e 1 com preciso basta usar o mtodo NextDouble(); Inclua um novo boto (btnGerarNumerosDouble) no formulrio e no seu evento Click digite o cdigo abaixo: private void btnGerarNumerosDouble_Click(object sender, EventArgs e) { Random randNum = new Random(); for (int i = 0; i < 10; i++) listaResultado.Items.Add(randNum.NextDouble()); } Abaixo temos o resultado obtido:

O mtodo NextDouble() gera um nmero double entre 0 e 1. Para concluir temos o mtodo NextBytes() que preenche os elementos de um conjunto especificado de bytes com nmeros aleatrios. Dessa forma cada elemento do array ser um byte com valor entre 0 e 255. Vamos incluir um novo Button (btnGerarNumerosNextBytes) no formulrio e no evento Click informar o cdigo abaixo: private void btnGerarNumeroNextByte_Click(object sender, EventArgs e) { byte[] randBytes = new byte[100]; Random randNum = new Random(); randNum.NextBytes(randBytes); for (int i = 0; i < 10; i++) listaResultado.Items.Add(randBytes[i]); } No cdigo acima definimos um array de bytes para 100 elementos; a seguir criamos uma instncia de Random() e depois usando o mtodo NextBytes preenchemos o array com nmeros aleatrios; Abaixo temos o resultado obtido:

Dessa forma apresentamos a classe Random() e seus mtodos para gerar nmeros aleatrios. Para encerrar vamos mostrar um exemplo prtico para gera senhas usando a classe Random(). (esta rotina foi obtida do site: http://csharpbrasil.com.br/csharp/dicagerando-numeros-randomicos-com-c-sharp/ ) Vamos definir a rotina abaixo no formulrio acima: public string GerarSenhas() { int Tamanho = 10; // Numero de digitos da senha string senha = string.Empty; for (int i = 0; i = 48 && codigo = 97 && codigo <= 122)) { string _char = ((char)codigo).ToString(); if (!senha.Contains(_char)) { senha += _char; } else { i; } } else { i; } } return senha; } Inclua um novo boto de comando no formulrio (btnGerarSenha) e no evento Click inclua o cdigo abaixo: private void btnGerarSenha_Click(object sender, EventArgs e) { string senha = GerarSenhas(); listaResultado.Items.Add( Senha gerada : + senha.ToUpper()); }

O resultado o seguinte:

Fonte: Macoratti .NET