Gerar Números Aleatórios em Delphi

Gerar Números Aleatórios em Delphi
Números em sequência.

Introdução

Nesse post iremos aprender como gerar números aleatórios em Delphi.

Geração de números aleatórios é uma tarefa comum em diversas áreas, como jogos, estatísticas, testes e simulações. No Delphi, isso pode ser feito com bastante facilidade utilizando a função Random. No entanto, garantir que esses números não se repitam exige uma abordagem um pouco mais cuidadosa. Neste artigo, vamos explicar como desenvolver um programa em Delphi para gerar números aleatórios sem repetição, permitindo que o usuário defina tanto a quantidade de números quanto o intervalo dentro do qual os números devem ser gerados.

E se você gosta de fazer aquela “fézinha”, jogando na mega-sena ou em qualquer outro jogo, você poderá utilizar esse programa para gerar os seus números da sorte.

Visão Geral do Programa

Nosso objetivo é criar um programa que:

  1. Gere uma quantidade definida de números aleatórios.
  2. Garanta que esses números não se repitam.
  3. Permita que o usuário determine a quantidade de números e o intervalo (limite superior) para a geração dos números aleatórios.

Implementação em Delphi

No nosso programa iremos precisar de duas caixas de texto(TEdit), uma para informar a quantidade de números aleatórios a serem gerados e outra para informar o limite de números que poderão ser gerados, um botão(TButton) para acionar a ação de gerar os números aleatórios e uma caixa de texto maior(TMemo) para exibir o resultado gerado.

Abaixo, apresento o código completo, seguido de uma explicação detalhada de cada parte.

uses
  SysUtils, Math, Classes;

procedure TForm1.GerarNumerosAleatorios(Quantidade, LimiteSuperior: Integer);
var
  NumerosGerados: TList;
  NumeroAleatorio, i: Integer;
  texto : String;
begin
  // Inicializa o gerador de números aleatórios com base no horário do sistema
  Randomize;

  // Cria uma lista para armazenar os números gerados
  NumerosGerados := TList.Create;
  try
    // Gera números aleatórios sem repetição
    while NumerosGerados.Count < Quantidade do
    begin
      NumeroAleatorio := Random(LimiteSuperior) + 1; // Gera número entre 1 e LimiteSuperior

      // Verifica se o número já foi gerado
      if NumerosGerados.IndexOf(Pointer(NumeroAleatorio)) = -1 then
      begin
        NumerosGerados.Add(Pointer(NumeroAleatorio)); // Adiciona o número à lista se ainda não foi gerado
      end;
    end;

    // Exibe os números gerados
    mmNumerosGerados.Clear;
    for i := 0 to NumerosGerados.Count - 1 do
      texto := texto + IntToStr(Integer(NumerosGerados[i])) + ' - ';
    mmNumerosGerados.Lines.Add(Copy(texto,1,length(texto)-3));
    
  finally
    NumerosGerados.Free; // Libera a memória alocada pela lista
  end;
end;

procedure TForm1.btnGerarNumerosClick(Sender: TObject);
var
  qtdeNumeros, limiteNumeros: Integer;

begin

  if (edtQuantidadeNumeros.Text = '') or (edtLimiteNumeros.Text = '') then
    begin
      ShowMessage('Informe a quantidade de números e o limite de números!');
      Exit;
    end;

  try
    qtdeNumeros := StrToInt(edtQuantidadeNumeros.Text);
    limiteNumeros := StrToInt(edtLimiteNumeros.Text);

    GerarNumerosAleatorios(qtdeNumeros, limiteNumeros);
  except
    on e: exception do
      ShowMessage('Erro ao gerar os números: '+e.Message);
  end;

end;

Explicação do Código

1. Importação de Bibliotecas

uses
  SysUtils, Math, Classes;

Aqui, estamos importando algumas bibliotecas que serão usadas no programa. A biblioteca SysUtils contém funções utilitárias, como Randomize e Random. A biblioteca Classes oferece o tipo TList, que é utilizado para armazenar os números gerados. Já Math contém funções matemáticas avançadas, mas neste caso, não é estritamente necessária.

2. Função Randomize e Random

Randomize;

A função Randomize inicializa o gerador de números aleatórios baseado no horário do sistema, garantindo que cada execução do programa gere uma sequência diferente de números. Já a função Random(LimiteSuperior) gera um número aleatório entre 0 e LimiteSuperior - 1. Para garantir que o número gerado esteja entre 1 e LimiteSuperior, somamos 1 ao valor gerado.

3. Verificando Números Repetidos

if NumerosGerados.IndexOf(Pointer(NumeroAleatorio)) = -1 then

A função IndexOf verifica se o número gerado já foi armazenado na lista NumerosGerados. Caso o número ainda não tenha sido gerado, ele é adicionado à lista. Para evitar números repetidos, o programa continua gerando novos números até que a quantidade desejada seja alcançada.

4. Armazenando os Números em uma Lista

NumerosGerados := TList.Create;

Utilizamos a classe TList para armazenar os números gerados. O TList é uma estrutura de dados do Delphi que permite armazenar qualquer tipo de valor, mas, neste caso, estamos utilizando para armazenar números inteiros.

5. Exibindo os Números Gerados

for i := 0 to NumerosGerados.Count - 1 do
  texto := texto + IntToStr(Integer(NumerosGerados[i])) + ' - ';
mmNumerosGerados.Lines.Add(Copy(texto,1,length(texto)-3));

Aqui, utilizamos um laço for para percorrer a lista de números gerados e armazená-los na variável texto. Em seguida a variável texto é inserida no Memo para que os números sejam exibidos.

Veja abaixo a ilustração do projeto:

Ilustração do projeto.

Código fonte do exemplo

Você pode fazer o download do exemplo do projeto através do repositório do github:

https://github.com/Gisele-de-Melo/Numeros_Aleatorios

Conclusão

Este programa em Delphi para gerar números aleatórios sem repetição é uma solução eficiente e prática para diversos problemas em que a aleatoriedade é necessária. A implementação mostra como utilizar a função Random de forma eficiente, ao mesmo tempo que lida com a necessidade de evitar repetições. Além disso, o uso da classe TList permite armazenar e gerenciar os números gerados de forma simples e organizada.

Ao implementar esse código, você pode facilmente personalizar o intervalo e a quantidade de números gerados, tornando-o útil em diversas aplicações.

Posts Relacionados


Livros + e-books

Delphi para Android e iOS

codedelphi.com
codedelphi.com

Delphi Start

codedelphi.com

Programando em Delphi XE

Aprenda programar Delphi

Banco de Dados RAD Delphi

Delphi Programming Projects

Deixe um comentário