Gerar numeros aleatórios sem repetir
Fiz esse código abaixo para gerar numeros aleatórios de 1 á 10:
porém tenho 2 problemas ai;
1 > Queria gerar um numero aleatório de 1 á 10 e não de 0 á 10, nesse caso está gerando numero 0.
2 > Está repetindo os numeros e não poderia repetir.
Tipo queria que gerasse os numeros e bagunçasse com ele, algém poderia me ajudar com esses 2 probleminhas, pois já pesquisei sobre o Random e não consegui resolver.
procedure TForm1.Button2Click(Sender: TObject); var Num: Byte; a : integer; begin Randomize; for a := 1 to 10 do begin Num := Random(10); Memo1.Lines.Add(IntToStr(Num)); end; end;
porém tenho 2 problemas ai;
1 > Queria gerar um numero aleatório de 1 á 10 e não de 0 á 10, nesse caso está gerando numero 0.
2 > Está repetindo os numeros e não poderia repetir.
Tipo queria que gerasse os numeros e bagunçasse com ele, algém poderia me ajudar com esses 2 probleminhas, pois já pesquisei sobre o Random e não consegui resolver.
Robson Morais
Curtidas 0
Respostas
Marco Salles
02/06/2011
const
C=10;
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]));
Memo1.Lines.Add('*******');
GOSTEI 0
Robson Morais
02/06/2011
Deu certo, mas eu queria assim que a minha constante const C=10; podesse receber o valor de uma variavel que é a quantidade de numeros aleatórios que vai ter que gerar.
GOSTEI 0
Marco Salles
02/06/2011
Deu certo, mas eu queria assim que a minha constante const C=10; podesse receber o valor de uma variavel que é a quantidade de numeros aleatórios que vai ter que gerar.
e qual a dificuldade ??? basta utilizar em vez de constantes uma variavel e a matriz ser DINAMICA em vez de
constante . Vc consegue cara .
So uma dica valiosa . Este método postado o processamento dele é rápido comprado com outros similares que espalhados pela rede , porem quando o C aumenta a performance pode cair mais ao fato do carregamento que se faz do memo do que o processamento em si
for I := Low(Num) to High(Num) do
Memo1.Lines.Add(IntToStr(Num[I])); // isto consome tempo devido a apresentação dos dados
Então para melhorar a performance se deve lançar mão de dois métodos definidos na classe TStrings
BeginUpdate e EndUpdate
Memo1.Lines.BeginUpdate;
for I := Low(Num) to High(Num) do
Memo1.Lines.Add(IntToStr(Num[I]));
Memo1.Lines.EndUpdate;
GOSTEI 0
Robson Morais
02/06/2011
ficou show de bola.....
obrigado pela ajuda
var I, A, P : Integer; Num: array of Integer; begin SetLength(Num,Qtd);// Recebe a quantidade de suportes ....etc
obrigado pela ajuda
GOSTEI 0