Sorteio de Numeros Aleatorios

Delphi

07/02/2004

Ola turma,
Qual código devo usar ao clicar um botão, mostrar em um (Memo) ou em (edites) num universo de 25 numeros ser sorteados 15 aleatoriamente, sem repetição.

desde ja obrigado.


Clenio

Clenio

Curtidas 0

Respostas

Beppe

Beppe

07/02/2004

Números de 1 a 25:
var
  Sorteados: set of 1..25;
  I, Numero: Integer;
begin
  Sorteados := [];                    // conjunto vazio
  for I := 1 to 15 do
  begin
    repeat                            // repete até que encontre um não
      Numero := Random(25) + 1;       // no conjunto dos sorteados
    until not (Numero in Sorteados);
    Include(Sorteados, Numero);       // adiciona ao grupo

    Memo1.Lines.Add(IntToStr(Numero));
  end;
end;



GOSTEI 0
Clenio

Clenio

07/02/2004

Valeu, Beppe, muito obrigado deu certinho do jeito que eu queria, abraços.


GOSTEI 0
Kroki

Kroki

07/02/2004

Eu so nao entendi o 1 ao 15...


GOSTEI 0
Drakkar

Drakkar

07/02/2004

Eu so nao entendi o 1 ao 15...


São 15 números... por isso..


GOSTEI 0
Kroki

Kroki

07/02/2004

DEtalhe,colei o codigo e coloquei em um evento de clik de botao e o programa trava.
Oque eu errei?


GOSTEI 0
Beppe

Beppe

07/02/2004

DEtalhe,colei o codigo e coloquei em um evento de clik de botao e o programa trava. Oque eu errei?


Vcoê tá tentando gerar mais de 25 números?


GOSTEI 0
Marco Salles

Marco Salles

07/02/2004

Beppe , Dentro Da Sua Lógica e Para Que o Programa Não Trave Devido a Um lOOP ´Infinito´, Ploblema Detectado Pelo Amigo kroki , Não Estaria Faltando o Operador ´Not´ Aplicado Junto a Istrução Until.... Assim, Sugiro Um Modificação , Trocar
[color=red:77c51d6063]until (Numero in Sorteados); Por until not (Numero in Sorteados);[/color:77c51d6063]


GOSTEI 0
Beppe

Beppe

07/02/2004

[quote:3716140681=´Marco Salles´]Beppe , Dentro Da Sua Lógica e Para Que o Programa Não Trave Devido a Um lOOP ´Infinito´, Ploblema Detectado Pelo Amigo kroki , Não Estaria Faltando o Operador ´Not´ Aplicado Junto a Istrução Until.... Assim, Sugiro Um Modificação , Trocar
[color=red:3716140681]until (Numero in Sorteados); Por until not (Numero in Sorteados);[/color:3716140681][/quote:3716140681]

Putz, falha nossa! :oops: Nada escapa aos seus olhos atentos, hein?
A explicação que coloquei do lado dizia uma coisa, mas o código ´dizia´ outra... Valeu!


GOSTEI 0
Clenio

Clenio

07/02/2004

O programinha ta funcionando beleza, querendo melhorar um pouquinho, eu gostaria de fazer com que o Memo mostre os numeros em ordem crescente, o que eu devo acrescentar no codigo para fazer isso?

Desde ja obrigado.


GOSTEI 0
Beppe

Beppe

07/02/2004

Os números são retornados de forma totalmente aleatória, sem ordem especifica. A solução genérica seria armazenar os números em um array, e pô-los com um algoritmo de ordenação. Mas neste é caso é bem simples, como os números sorteados estão em um set.

var 
  Sorteados: set of 1..25; 
  I, Numero: Integer; 
begin 
  Sorteados := [];                    // conjunto vazio 
  for I := 1 to 15 do 
  begin 
    repeat                            // repete até que encontre um não 
      Numero := Random(25) + 1;       // no conjunto dos sorteados 
    until not (Numero in Sorteados); 
    Include(Sorteados, Numero);       // adiciona ao grupo 
  end; 
  for I := 1 to 25 do
    if Numero in Sorteados then
      Memo1.Lines.Add(IntToStr(I)); 
end;



GOSTEI 0
Kroki

Kroki

07/02/2004

Se nao estou enganado,é preciso declarar antes da geracao dos numeros
o comando ´Randomize´ou os numeros gerados sempre serao os mesmos.


GOSTEI 0
Beppe

Beppe

07/02/2004

Se nao estou enganado,é preciso declarar antes da geracao dos numeros o comando ´Randomize´ou os numeros gerados sempre serao os mesmos.


Sim, para que a cada execução do programa a sequência não seja a mesma.
Chamá-lo uma vez é suficiente, no OnCreate.


GOSTEI 0
POSTAR