Fórum Sorteio de Números no Delphi #599468

03/01/2019

0

Boa noite a todos, como vão??

Estou tentando montar um Bingo no Delphi para um trabalho escolar, porém preciso de um ajuda.

Com o código abaixo, consigo gerar uma lista de números aleatórios, porém preciso gerar somente um número e guardar no vetor e conforme eu for gerando os outros número não pode sair o número que eu já gerei que esta guardado no Vetor. Poderiam me ajudar?? Desde já agradeço!!

const
C=79;
var
I, A, P : Integer;
Num: array[0..C - 1] of Integer;
begin
randomize;
for I := 0 to C - 1 do
Num[I] := I+1;
for I := C - 1 downto 0 do
begin
P := Random(I+1);
A := Num[I];
Num[I] := Num[P];
Num[P] := A;
end;

for I := Low(Num) to High(Num) do
Memo1.Lines.Add(IntToStr(Num[I]));
end;
Vinicius David

Vinicius David

Responder

Posts

04/01/2019

Jucélio Silva

E ae Vinicius blz cara,

Tem varias forma e chagar nesse resultado com Objetos do Delphi, segue uma sugestão :
 // na tela tem um botão que executa a rotina e um memo para mostrar os valores, mas pode montar da forma que achar melhor.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, cxLookAndFeelPainters, cxControls, cxContainer, cxEdit,
  cxTextEdit, cxMemo, StdCtrls, cxButtons;

type
  TForm1 = class(TForm)
    cxButton1: TcxButton;
    memo1: TcxMemo;
    procedure cxButton1Click(Sender: TObject);
    function SorteiaNumero:String; // função que gera o numero randomico
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.cxButton1Click(Sender: TObject);  // botão que executa a rotina
//var listaSorteador : TStringList;
var bGeraNumero:boolean;
    cNumeroSorteado : String;
    nTentativas : Word;
begin

   bGeraNumero :=true; // variavel de teste para parar o loop de verificação
   nTentativas:=0; // quantidade maxima de tentativas caso tenha saido os 99 numeros nesse caso XD

   while bGeraNumero do // testa até achar um novo numero que não esteja na lista
     begin
       inc(nTentativas); // incrementa o numero maximo de teste
       cNumeroSorteado := SorteiaNumero;

       if(memo1.Lines.IndexOf(cNumeroSorteado)=-1)then // testa se o numero está na listagem
         begin
           bGeraNumero:=false; // para o loop de teste
           memo1.Lines.Add(cNumeroSorteado); // adiciona a nova linha com numero que ainda não foi sorteado
         end;

       if(nTentativas>99)then // chegou no limite e todos os numeros já foram sorteados
         bGeraNumero:=false; // para o loop de teste

     end;
end;

function TForm1.SorteiaNumero: String;
begin
  randomize; // prepara a randomização para que seja aleatória
  result := IntToStr(Round(random(99))); // gera o numero randomico
end;

end.

Responder

Gostei + 0

04/01/2019

Jucélio Silva

"chagar = chegar *" XD o forum não deixa editar envios ;(
E ae Vinicius blz cara,

Tem varias forma e chegar nesse resultado com Objetos do Delphi, segue uma sugestão :
 // na tela tem um botão que executa a rotina e um memo para mostrar os valores, mas pode montar da forma que achar melhor.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, cxLookAndFeelPainters, cxControls, cxContainer, cxEdit,
  cxTextEdit, cxMemo, StdCtrls, cxButtons;

type
  TForm1 = class(TForm)
    cxButton1: TcxButton;
    memo1: TcxMemo;
    procedure cxButton1Click(Sender: TObject);
    function SorteiaNumero:String; // função que gera o numero randomico
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.cxButton1Click(Sender: TObject);  // botão que executa a rotina
//var listaSorteador : TStringList;
var bGeraNumero:boolean;
    cNumeroSorteado : String;
    nTentativas : Word;
begin

   bGeraNumero :=true; // variavel de teste para parar o loop de verificação
   nTentativas:=0; // quantidade maxima de tentativas caso tenha saido os 99 numeros nesse caso XD

   while bGeraNumero do // testa até achar um novo numero que não esteja na lista
     begin
       inc(nTentativas); // incrementa o numero maximo de teste
       cNumeroSorteado := SorteiaNumero;

       if(memo1.Lines.IndexOf(cNumeroSorteado)=-1)then // testa se o numero está na listagem
         begin
           bGeraNumero:=false; // para o loop de teste
           memo1.Lines.Add(cNumeroSorteado); // adiciona a nova linha com numero que ainda não foi sorteado
         end;

       if(nTentativas>99)then // chegou no limite e todos os numeros já foram sorteados
         bGeraNumero:=false; // para o loop de teste

     end;
end;

function TForm1.SorteiaNumero: String;
begin
  randomize; // prepara a randomização para que seja aleatória
  result := IntToStr(Round(random(99))); // gera o numero randomico
end;

end.

Responder

Gostei + 0

04/01/2019

Emerson Nascimento

tente assim (não tenho Delphi instalado, então pode dar algum erro, mas a idéia geral é essa):
const
	C = 79;
	MaiorDezena = 90;
var
	I, A, P: Integer;
	Num: array[0..C - 1] of Integer;
	NotFound: boolean;
begin
	randomize;

	// atribui 0 (zero) a todos os elementos
	for I := low(Num) to high(Num) do Num[I] := 0;

	// faz o sorteio
	for I := high(Num) downto low(Num) do
	begin
		repeat
			NotFound := True;
			P := 1 + Random( MaiorDezena );
			for A := high(Num) downto I-1 do // verifica se o número já não foi sorteado
				if Num[A] = P then
				begin
					NotFound := False;
					Break;
				end;
		until NotFound;
		Num[I] := P;
	end;

	for I := Low(Num) to High(Num) do Memo1.Lines.Add(IntToStr(Num[I]));

end;


Responder

Gostei + 0

15/01/2019

Vinicius David

E ae Vinicius blz cara,

Tem varias forma e chagar nesse resultado com Objetos do Delphi, segue uma sugestão :
 // na tela tem um botão que executa a rotina e um memo para mostrar os valores, mas pode montar da forma que achar melhor.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, cxLookAndFeelPainters, cxControls, cxContainer, cxEdit,
  cxTextEdit, cxMemo, StdCtrls, cxButtons;

type
  TForm1 = class(TForm)
    cxButton1: TcxButton;
    memo1: TcxMemo;
    procedure cxButton1Click(Sender: TObject);
    function SorteiaNumero:String; // função que gera o numero randomico
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.cxButton1Click(Sender: TObject);  // botão que executa a rotina
//var listaSorteador : TStringList;
var bGeraNumero:boolean;
    cNumeroSorteado : String;
    nTentativas : Word;
begin

   bGeraNumero :=true; // variavel de teste para parar o loop de verificação
   nTentativas:=0; // quantidade maxima de tentativas caso tenha saido os 99 numeros nesse caso XD

   while bGeraNumero do // testa até achar um novo numero que não esteja na lista
     begin
       inc(nTentativas); // incrementa o numero maximo de teste
       cNumeroSorteado := SorteiaNumero;

       if(memo1.Lines.IndexOf(cNumeroSorteado)=-1)then // testa se o numero está na listagem
         begin
           bGeraNumero:=false; // para o loop de teste
           memo1.Lines.Add(cNumeroSorteado); // adiciona a nova linha com numero que ainda não foi sorteado
         end;

       if(nTentativas>99)then // chegou no limite e todos os numeros já foram sorteados
         bGeraNumero:=false; // para o loop de teste

     end;
end;

function TForm1.SorteiaNumero: String;
begin
  randomize; // prepara a randomização para que seja aleatória
  result := IntToStr(Round(random(99))); // gera o numero randomico
end;

end.






Nesse caso até que deu certo.... porém esta retornando em lista no Memo.... gostaria que retornasse somente um número por vez....

Se eu comentar essa parte: memo1.Lines.Add(cNumeroSorteado);

e transformar em

memo1.Text := cNumeroSorteado;

ele até sai somente um número, porém ele não verifica se já saiu ou não o número....

o que posso fazer??
Responder

Gostei + 0

15/01/2019

Vinicius David

Boa noite, pessoal

Literalmente estou com problema nesse ponto abaixo:

if(memo1.Lines.IndexOf(cNumeroSorteado)=-1)then // testa se o numero está na listagem
begin
bGeraNumero:=false; // para o loop de teste
//memo1.Lines.Add(cNumeroSorteado); // adiciona a nova linha com numero que ainda não foi sorteado
memo1.Text := cNumeroSorteado;
end;

onde preciso fazer com que no memo1 apareça somente 1 número por vez e creio que deva guardar em uma matriz ou vetor.... porém mesmo eu colocando a variável array como string não consigo relacionar o memo1 com ela.

o que posso fazer?
Responder

Gostei + 0

09/07/2022

Hudson

E ae Vinicius blz cara,

Tem varias forma e chagar nesse resultado com Objetos do Delphi, segue uma sugestão :
 // na tela tem um botão que executa a rotina e um memo para mostrar os valores, mas pode montar da forma que achar melhor.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, cxLookAndFeelPainters, cxControls, cxContainer, cxEdit,
  cxTextEdit, cxMemo, StdCtrls, cxButtons;

type
  TForm1 = class(TForm)
    cxButton1: TcxButton;
    memo1: TcxMemo;
    procedure cxButton1Click(Sender: TObject);
    function SorteiaNumero:String; // função que gera o numero randomico
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.cxButton1Click(Sender: TObject);  // botão que executa a rotina
//var listaSorteador : TStringList;
var bGeraNumero:boolean;
    cNumeroSorteado : String;
    nTentativas : Word;
begin

   bGeraNumero :=true; // variavel de teste para parar o loop de verificação
   nTentativas:=0; // quantidade maxima de tentativas caso tenha saido os 99 numeros nesse caso XD

   while bGeraNumero do // testa até achar um novo numero que não esteja na lista
     begin
       inc(nTentativas); // incrementa o numero maximo de teste
       cNumeroSorteado := SorteiaNumero;

       if(memo1.Lines.IndexOf(cNumeroSorteado)=-1)then // testa se o numero está na listagem
         begin
           bGeraNumero:=false; // para o loop de teste
           memo1.Lines.Add(cNumeroSorteado); // adiciona a nova linha com numero que ainda não foi sorteado
         end;

       if(nTentativas>99)then // chegou no limite e todos os numeros já foram sorteados
         bGeraNumero:=false; // para o loop de teste

     end;
end;

function TForm1.SorteiaNumero: String;
begin
  randomize; // prepara a randomização para que seja aleatória
  result := IntToStr(Round(random(99))); // gera o numero randomico
end;

end.



Utilizei esse código em um sistema de bingo que estou fazendo, porém, estou enfrentando um problema ao sortear, ex. em um sorteio de 75 números, sempre fica um número sem sortear, porque o número 0 é contado fazendo parte dos 75 números, se coloco para sortear 76, corro risco de aparecer o número 76 no lugar de outro número válido como resolver isso?
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar