Gerador de Números Em Delphi

Delphi

25/06/2021

Bom dia Mestre das Programação em Delphi. Eu andei pesquisando na internet um assunto referente a geração de sorteios da Mega Sena e em um site achei algo similar ao que eu tinha em mente, mais ainda não esta como eu imaginei. Vou posta o código abaixo. No código fiz uma mudança, lá no site que eu achei esse código no final ele colocava uma mensagem com o resultado, eu coloquei um Memo.

Pois bem o que estou querendo implementar nesse código é o seguinte: Eu colocar um TEdit (que receba apenas numero 1 .....), ai quando clica no botão ele gere a quantidade de sorteios que a pessoa digitou no Edit. Pois da forma que esta tem que fica clicando no botão para gerar os sorteios. Conto com a ajuda de vocês para fazer essa implementação no código. Desde já grato pela ajuda.

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 s : array[0..5] of Integer;
 i, a, b, z : Integer;
begin
  b := 7;
  Randomize;
  while b > 6 do
    begin
      b:= 0;
        for I := 0 to 5 do
          s[i] := Random(61);

       for I := 0 to 5 do
         begin
           a := s[i];
           if a = 0 then
            b := b + 1;
            for z := 0 to 5 do
              if a = s[z] then
                if a = s[z] then
                  b := b + 1;
         end;
    end;


    for z := 0 to 4 do
      begin
        for I := 0 to 4 do
          if s[i] > s[i+1] then
            begin
              a := s[i+1];
              s[i+1] := s[i];
              s[i] := a;
            end;
      end;


   Memo1.Lines.Add(
        IntToStr(s[0]) + ' - ' +
        IntToStr(s[1]) + ' - ' +
        IntToStr(s[2]) + ' - ' +
        IntToStr(s[3]) + ' - ' +
        IntToStr(s[4]) + ' - ' +
        IntToStr(s[5]));

end;

end.
Rubens Pena

Rubens Pena

Curtidas 0

Melhor post

Natanael Ferreira

Natanael Ferreira

25/06/2021

Inclua seu código em um Loop For.

Exemplo:

procedure TForm1.Button1Click(Sender: TObject);
var
  s: array [0 .. 5] of Integer;
  i, a, b, z, j: Integer;
begin
  Memo1.Clear;

  for j := 0 to StrToIntDef(Edit1.Text, 0) - 1 do
  begin
    b := 7;
    Randomize;
    while b > 6 do
    begin
      b := 0;
      for i := 0 to 5 do
        s[i] := Random(61);

      for i := 0 to 5 do
      begin
        a := s[i];
        if a = 0 then
          b := b + 1;
        for z := 0 to 5 do
          if a = s[z] then
            if a = s[z] then
              b := b + 1;
      end;
    end;

    for z := 0 to 4 do
    begin
      for i := 0 to 4 do
        if s[i] > s[i + 1] then
        begin
          a := s[i + 1];
          s[i + 1] := s[i];
          s[i] := a;
        end;
    end;

    Memo1.Lines.Add(IntToStr(s[0]) + ' - ' + IntToStr(s[1]) + ' - ' + IntToStr(s[2]) + ' - ' + IntToStr(s[3]) + ' - ' +
      IntToStr(s[4]) + ' - ' + IntToStr(s[5]));
  end;
end;
GOSTEI 1

Mais Respostas

Emerson Nascimento

Emerson Nascimento

25/06/2021

tente algo assim:
procedure TForm5.Button1Click(Sender: TObject);
var
  Aposta: array of integer; // neste momento não sei quantos números serão sorteados
  NumeroDeApostas, NumerosPorAposta: integer;
  Sorteios, Sorteado: integer;
  AddMemo, NumerosSorteados: integer;
  strAposta: string;

  function ExisteNumero(Numero: integer): boolean;
  var
    iBusca: integer;
  begin
    Result := False;
    for iBusca := Low(Aposta) to High(Aposta) do
      if Aposta[iBusca] = Numero then
      begin
        Result := True;
        exit;
      end;
  end;
begin
  Randomize;

  MemoApostas.Clear; // limpa o memo
  NumeroDeApostas := SpinEdit1.Value; // quantidade de apostas a serem geradas
  NumerosPorAposta := SpinEdit2.Value; // quantidade de números por aposta
  SetLength(Aposta, NumerosPorAposta);

  for Sorteios := 1 to NumeroDeApostas do
  begin
    NumerosSorteados := 0;

    while NumerosSorteados < NumerosPorAposta do
    begin
      Sorteado := Random(60)+1; // sorteia de 1 a 60
      if not ExisteNumero(Sorteado) then
      begin
        Aposta[NumerosSorteados] := Sorteado;
        Inc(NumerosSorteados);
      end;
    end;

    strAposta := '';
    for AddMemo := Low(Aposta) to High(Aposta) do
    begin
      if strAposta <> EmptyStr then
        strAposta := strAposta + ', ';

      strAposta := strAposta + IntToStr(Aposta[AddMemo]);
      Aposta[AddMemo] := 0; // limpa o conteúdo da aposta
    end;

    MemoApostas.Lines.Add( strAposta );
  end;
end;
GOSTEI 1
Rubens Pena

Rubens Pena

25/06/2021

Bom noite mestres da Programação em Delphi. Gostaria de Agradecer Natanael Ferreira e Emerson Nascimento, por terem tirado um tempo do seu tempo para me ajudar com esse código, testei ambos e salvei ambos em forms separados.

Agora o código que Emerson Nascimento passou é como se ele tivesse interpretado 100% a minha linha de pensamento, ficou show, reduziu bastante as linhas que estava no código inicial, sem falar esse componente do SpinEdit (muito bom ele), esse código servira para as demais modalidades.

Muito obrigado a ambos.
GOSTEI 0
Rubens Pena

Rubens Pena

25/06/2021

tente algo assim:
procedure TForm5.Button1Click(Sender: TObject);
var
  Aposta: array of integer; // neste momento não sei quantos números serão sorteados
  NumeroDeApostas, NumerosPorAposta: integer;
  Sorteios, Sorteado: integer;
  AddMemo, NumerosSorteados: integer;
  strAposta: string;

  function ExisteNumero(Numero: integer): boolean;
  var
    iBusca: integer;
  begin
    Result := False;
    for iBusca := Low(Aposta) to High(Aposta) do
      if Aposta[iBusca] = Numero then
      begin
        Result := True;
        exit;
      end;
  end;
begin
  Randomize;

  MemoApostas.Clear; // limpa o memo
  NumeroDeApostas := SpinEdit1.Value; // quantidade de apostas a serem geradas
  NumerosPorAposta := SpinEdit2.Value; // quantidade de números por aposta
  SetLength(Aposta, NumerosPorAposta);

  for Sorteios := 1 to NumeroDeApostas do
  begin
    NumerosSorteados := 0;

    while NumerosSorteados < NumerosPorAposta do
    begin
      Sorteado := Random(60)+1; // sorteia de 1 a 60
      if not ExisteNumero(Sorteado) then
      begin
        Aposta[NumerosSorteados] := Sorteado;
        Inc(NumerosSorteados);
      end;
    end;

    strAposta := '';
    for AddMemo := Low(Aposta) to High(Aposta) do
    begin
      if strAposta <> EmptyStr then
        strAposta := strAposta + ', ';

      strAposta := strAposta + IntToStr(Aposta[AddMemo]);
      Aposta[AddMemo] := 0; // limpa o conteúdo da aposta
    end;

    MemoApostas.Lines.Add( strAposta );
  end;
end;

Boa tarde mestre. Com relação aos números saírem na ordem crescente, poderia fazer essa pequena alteração ai no seu código para mim?
E aproveitando o momento acrescentar uma numeração das linhas.
Exemplo:
01: 5-10-11-23-28-35
02: 11-22-24-25-58-60
03: 7-14-21-28-35-42
.
.
.
.

Obrigado pela atenção...
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

25/06/2021

segue...
procedure TForm5.Button1Click(Sender: TObject);
var
  Aposta: TStringList;
  NumeroDeApostas, NumerosPorAposta: integer;
  Sorteios, AddMemo: integer;
  strSorteado, strAposta: string;
begin
  Randomize; // o correto é colocar no OnCreate do form, porque precisa ser chamado apenas 1 vez

  MemoApostas.Clear; // limpa o memo
  NumeroDeApostas := SpinEdit1.Value; // quantidade de apostas a serem geradas
  NumerosPorAposta := SpinEdit2.Value; // quantidade de números por aposta
  Aposta := TStringList.Create; // cria a aposta

  for Sorteios := 1 to NumeroDeApostas do
  begin
    Aposta.Clear; // limpa a aposta
    while Aposta.Count < NumerosPorAposta do
    begin
      strSorteado := FormatFloat('00', Random(60)+1); // sorteia de 1 a 60
      if Aposta.IndexOf(strSorteado) < 0 then
        Aposta.Add(strSorteado);
    end;
    Aposta.Sort; // ordena os números da aposta

    strAposta := '';
    for AddMemo := 0 to Aposta.Count-1 do
    begin
      if strAposta <> EmptyStr then
        strAposta := strAposta + ', ';

      strAposta := strAposta + Aposta[AddMemo];
    end;

    MemoApostas.Lines.Add( strAposta );
  end;
end;

GOSTEI 1
Rubens Pena

Rubens Pena

25/06/2021

segue...
procedure TForm5.Button1Click(Sender: TObject);
var
  Aposta: TStringList;
  NumeroDeApostas, NumerosPorAposta: integer;
  Sorteios, AddMemo: integer;
  strSorteado, strAposta: string;
begin
  Randomize; // o correto é colocar no OnCreate do form, porque precisa ser chamado apenas 1 vez

  MemoApostas.Clear; // limpa o memo
  NumeroDeApostas := SpinEdit1.Value; // quantidade de apostas a serem geradas
  NumerosPorAposta := SpinEdit2.Value; // quantidade de números por aposta
  Aposta := TStringList.Create; // cria a aposta

  for Sorteios := 1 to NumeroDeApostas do
  begin
    Aposta.Clear; // limpa a aposta
    while Aposta.Count < NumerosPorAposta do
    begin
      strSorteado := FormatFloat('00', Random(60)+1); // sorteia de 1 a 60
      if Aposta.IndexOf(strSorteado) < 0 then
        Aposta.Add(strSorteado);
    end;
    Aposta.Sort; // ordena os números da aposta

    strAposta := '';
    for AddMemo := 0 to Aposta.Count-1 do
    begin
      if strAposta <> EmptyStr then
        strAposta := strAposta + ', ';

      strAposta := strAposta + Aposta[AddMemo];
    end;

    MemoApostas.Lines.Add( strAposta );
  end;
end;


Show de Bola, Obrigado mestre. Mais uma vez Obrigado Pela Ajuda.
GOSTEI 0
Rubens Pena

Rubens Pena

25/06/2021

segue...
procedure TForm5.Button1Click(Sender: TObject);
var
  Aposta: TStringList;
  NumeroDeApostas, NumerosPorAposta: integer;
  Sorteios, AddMemo: integer;
  strSorteado, strAposta: string;
begin
  Randomize; // o correto é colocar no OnCreate do form, porque precisa ser chamado apenas 1 vez

  MemoApostas.Clear; // limpa o memo
  NumeroDeApostas := SpinEdit1.Value; // quantidade de apostas a serem geradas
  NumerosPorAposta := SpinEdit2.Value; // quantidade de números por aposta
  Aposta := TStringList.Create; // cria a aposta

  for Sorteios := 1 to NumeroDeApostas do
  begin
    Aposta.Clear; // limpa a aposta
    while Aposta.Count < NumerosPorAposta do
    begin
      strSorteado := FormatFloat('00', Random(60)+1); // sorteia de 1 a 60
      if Aposta.IndexOf(strSorteado) < 0 then
        Aposta.Add(strSorteado);
    end;
    Aposta.Sort; // ordena os números da aposta

    strAposta := '';
    for AddMemo := 0 to Aposta.Count-1 do
    begin
      if strAposta <> EmptyStr then
        strAposta := strAposta + ', ';

      strAposta := strAposta + Aposta[AddMemo];
    end;

    MemoApostas.Lines.Add( strAposta );
  end;
end;


Bom dia. Teria como fazer o sorteio com base nos números selecionados? Estou enviando o font do projeto pra que possa ser analisado um jeito de sortear em com base nas dezenas selecionada.

Link do font: ( https://mega.nz/file/DIpnHI4Q#q9fIvyq60Y-CVikUNcjmNa7VGOtKoYMtQkxFZ6wG1Mk )

Com relação ao código se não der pra postar aqui envia no meu email : rubens.pena7@gmail.com, vai me ajudar bastante. desde já grato pela atenção.
GOSTEI 0
POSTAR