Fórum Sorteio de Números no Delphi #599468
03/01/2019
0
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
Curtir tópico
+ 0Posts
04/01/2019
Jucélio Silva
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
04/01/2019
Jucélio Silva
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
04/01/2019
Emerson Nascimento
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
15/01/2019
Vinicius David
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
15/01/2019
Vinicius David
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
09/07/2022
Hudson
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
Clique aqui para fazer login e interagir na Comunidade :)