gerar numeros aleatorios para revista aleatoria
alguem me ajuda pfv
estou fazendo uma revista aleatoria sendo assim a pessoa que estara mechendo no programa ira escolher a porcentagem de pessoas que estarão sendo passadas pela revista ta essa parte eu fiz porem ele esta gerando numero repetido o que posso fazer para n gerar
with dm.IB_Pesquisa,sql do
//pega a quatidade de funcionarios
begin
close;
clear;
add(''select distinct *'');
add(''from funcionarios a,'');
add('' cartoes b'');
add(''where a.cod_pessoa = B.cod_pessoa'');
OPEN;
end;
dm.IB_Pesquisa.Last;
Nro_funcionarios := dm.IB_Pesquisa.RecordCount;
with dm.IB_Pesquisa,sql do
//pega a porcentagem escolhida pelo usuario
begin
close;
clear;
add(''select distinct * from REVISTAALEATORIA'');
OPEN;
end;
Nro_RevistaPorcentagem := dm.IB_Pesquisa.FieldByName(''PORCENTAGEMREVISTA'').AsInteger;
Sporcentagem := ((Nro_funcionarios * Nro_RevistaPorcentagem)div 100);
//fez a porcentagem para saber quantos funcionaios iram passar pela revista
for I := 1 to Sporcentagem do // 10 - valorRevista
begin
randomize;
num := Round(random(Nro_funcionarios)); // quantidade pessoas no banco
Label16.Caption:= FloatToStr(num);
//inicio salva banco
dm.IB_pessoasRevista.Open;
dm.IB_pessoasRevista.Append;
dm.IB_pessoasRevista.FieldByName(''COD_pessoa'').AsString := Label16.Caption;
dm.IB_pessoasRevista.post;
dm.IBTransaction1.Commit;
//fim salva banco
num := Round(random(99999));
Label2.Caption := IntToStr(num);
{...}
END;
end;
estou fazendo uma revista aleatoria sendo assim a pessoa que estara mechendo no programa ira escolher a porcentagem de pessoas que estarão sendo passadas pela revista ta essa parte eu fiz porem ele esta gerando numero repetido o que posso fazer para n gerar
with dm.IB_Pesquisa,sql do
//pega a quatidade de funcionarios
begin
close;
clear;
add(''select distinct *'');
add(''from funcionarios a,'');
add('' cartoes b'');
add(''where a.cod_pessoa = B.cod_pessoa'');
OPEN;
end;
dm.IB_Pesquisa.Last;
Nro_funcionarios := dm.IB_Pesquisa.RecordCount;
with dm.IB_Pesquisa,sql do
//pega a porcentagem escolhida pelo usuario
begin
close;
clear;
add(''select distinct * from REVISTAALEATORIA'');
OPEN;
end;
Nro_RevistaPorcentagem := dm.IB_Pesquisa.FieldByName(''PORCENTAGEMREVISTA'').AsInteger;
Sporcentagem := ((Nro_funcionarios * Nro_RevistaPorcentagem)div 100);
//fez a porcentagem para saber quantos funcionaios iram passar pela revista
for I := 1 to Sporcentagem do // 10 - valorRevista
begin
randomize;
num := Round(random(Nro_funcionarios)); // quantidade pessoas no banco
Label16.Caption:= FloatToStr(num);
//inicio salva banco
dm.IB_pessoasRevista.Open;
dm.IB_pessoasRevista.Append;
dm.IB_pessoasRevista.FieldByName(''COD_pessoa'').AsString := Label16.Caption;
dm.IB_pessoasRevista.post;
dm.IBTransaction1.Commit;
//fim salva banco
num := Round(random(99999));
Label2.Caption := IntToStr(num);
{...}
END;
end;
Lucas
Curtidas 0
Respostas
Emerson Nascimento
20/07/2020
tente algo assim:
var
A_Funcionarios_revista: array of integer; // guarda os funcionários selecionados
i, Nro_funcionarios, Nro_RevistaPorcentagem, Nro_funcionarios_revista: integer;
num: integer;
function ExisteNum( vetor: array of integer; Numero: integer ): boolean;
var
i: integer;
begin
Result := False;
for i := Low(vetor) to High(vetor) do
if vetor[i] = numero then
begin
Result := True;
exit;
end;
end;
begin
// pega a quatidade de funcionarios
with dm.IB_Pesquisa, dm.IB_Pesquisa.sql do
begin
close;
clear;
add('select count(a.cod_pessoa) total from funcionarios a');
add('inner join cartoes b on b.cod_pessoa = a.cod_pessoa');
open;
end;
Nro_funcionarios := dm.IB_Pesquisa.fields[0].AsInteger;
// pega a porcentagem escolhida pelo usuario
with dm.IB_Pesquisa, dm.IB_Pesquisa.sql do
begin
close;
clear;
// não entendi esta instrução, principalmente o uso do distinct
add('select * from REVISTAALEATORIA');
open;
end;
Nro_RevistaPorcentagem := dm.IB_Pesquisa.FieldByName(''PORCENTAGEMREVISTA'').AsInteger;
// quantos funcionários irão passar pela revista
Nro_funcionarios_revista := ((Nro_funcionarios * Nro_RevistaPorcentagem) div 100);
if Nro_funcionarios_revista = 0 then Nro_funcionarios_revista := 1;
randomize; // chamado uma única vez
while Length(A_Funcionarios_revista) <> Nro_funcionarios_revista do
begin
num := Round(random(Nro_funcionarios)+1); // quantidade pessoas no banco
if not ExisteNum( A_Funcionarios_revista, num ) then
begin
SetLength(A_Funcionarios_revista,Length(A_Funcionarios_revista)+1);
A_Funcionarios_revista[High(A_Funcionarios_revista)] := num;
end;
end;
dm.IB_pessoasRevista.Open;
for i := Low(A_Funcionarios_revista) to High(A_Funcionarios_revista) do
begin
num := A_Funcionarios_revista[i];
Label16.Caption:= IntToStr(num);
dm.IB_pessoasRevista.Append;
dm.IB_pessoasRevista.FieldByName(''COD_pessoa'').AsString := Label16.Caption;
dm.IB_pessoasRevista.post;
// fim salva banco
Label2.Caption := IntToStr(num);
// { ... }
end;
dm.IBTransaction1.Commit;
end;
GOSTEI 0
Lucas
20/07/2020
tente algo assim:
var
A_Funcionarios_revista: array of integer; // guarda os funcionários selecionados
i, Nro_funcionarios, Nro_RevistaPorcentagem, Nro_funcionarios_revista: integer;
num: integer;
function ExisteNum( vetor: array of integer; Numero: integer ): boolean;
var
i: integer;
begin
Result := False;
for i := Low(vetor) to High(vetor) do
if vetor[i] = numero then
begin
Result := True;
exit;
end;
end;
begin
// pega a quatidade de funcionarios
with dm.IB_Pesquisa, dm.IB_Pesquisa.sql do
begin
close;
clear;
add(''select count(a.cod_pessoa) total from funcionarios a'');
add(''inner join cartoes b on b.cod_pessoa = a.cod_pessoa'');
open;
end;
Nro_funcionarios := dm.IB_Pesquisa.fields[0].AsInteger;
// pega a porcentagem escolhida pelo usuario
with dm.IB_Pesquisa, dm.IB_Pesquisa.sql do
begin
close;
clear;
// não entendi esta instrução, principalmente o uso do distinct
add(''select * from REVISTAALEATORIA'');
open;
end;
Nro_RevistaPorcentagem := dm.IB_Pesquisa.FieldByName(''''PORCENTAGEMREVISTA'''').AsInteger;
// quantos funcionários irão passar pela revista
Nro_funcionarios_revista := ((Nro_funcionarios * Nro_RevistaPorcentagem) div 100);
if Nro_funcionarios_revista = 0 then Nro_funcionarios_revista := 1;
randomize; // chamado uma única vez
while Length(A_Funcionarios_revista) <> Nro_funcionarios_revista do
begin
num := Round(random(Nro_funcionarios)+1); // quantidade pessoas no banco
if not ExisteNum( A_Funcionarios_revista, num ) then
begin
SetLength(A_Funcionarios_revista,Length(A_Funcionarios_revista)+1);
A_Funcionarios_revista[High(A_Funcionarios_revista)] := num;
end;
end;
dm.IB_pessoasRevista.Open;
for i := Low(A_Funcionarios_revista) to High(A_Funcionarios_revista) do
begin
num := A_Funcionarios_revista[i];
Label16.Caption:= IntToStr(num);
dm.IB_pessoasRevista.Append;
dm.IB_pessoasRevista.FieldByName(''''COD_pessoa'''').AsString := Label16.Caption;
dm.IB_pessoasRevista.post;
// fim salva banco
Label2.Caption := IntToStr(num);
// { ... }
end;
dm.IBTransaction1.Commit;
end;
onde que eu ponho isto aqui
var
A_Funcionarios_revista: array of integer; // guarda os funcionários selecionados
i, Nro_funcionarios, Nro_RevistaPorcentagem, Nro_funcionarios_revista: integer;
num: integer;
?
GOSTEI 0