Sorteio de Números no Delphi
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;
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
Curtidas 0
Respostas
Jucélio Silva
03/01/2019
E ae Vinicius blz cara,
Tem varias forma e chagar nesse resultado com Objetos do Delphi, segue uma sugestão :
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.
GOSTEI 0
Jucélio Silva
03/01/2019
"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 :
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.
GOSTEI 0
Emerson Nascimento
03/01/2019
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;
GOSTEI 0
Vinicius David
03/01/2019
E ae Vinicius blz cara,
Tem varias forma e chagar nesse resultado com Objetos do Delphi, segue uma sugestão :
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??
GOSTEI 0
Vinicius David
03/01/2019
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?
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?
GOSTEI 0
Hudson
03/01/2019
E ae Vinicius blz cara,
Tem varias forma e chagar nesse resultado com Objetos do Delphi, segue uma sugestão :
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?
GOSTEI 0