Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

thales.saraiva

Programa para campeonato!

Recommended Posts

Olá pessoal, Em um programa que estou desenvolvendo, preciso fazer com que os registros da tabela seja aleatório(random). O programa é para um campeonato esportivo onde terão várias chaves e o programa terá que gerar essas chaves, mas, preciso que o programa sorteie essas chaves distribuindo os participantes aleatóriamente. Vocês poderiam me ajudar com um exemplo do codigo de uma função "Random"? Desde já, agradeço a atenção!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Colega,

 

var   I: Integer; begin   Randomize;   for I := 1 to 50 do begin     { Write to window at random locations }     Canvas.TextOut(Random(Width), Random(Height), 'Boo!');   end; end;

Talvez não tenha visto ainda, mas este é o exemplo que está no help. Se a dúvida permancecer, coloque mais detalhes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Colega, para o que você está tentando fazer, eu sugiro trazer todos os times pra uma TStringList antes de começar a randomização... E da TStringList ir fazendo a randomização, e removendo da mesma os times já escolhidos... Exemplo:

Var wTimes : TStringList;      wTimesRandom : TStringList;      wI : Integer;Begin    wTimes := TStringList.Create;    Tabela.First;    While Not Tabela.Eof Do Begin        wTimes.Add( Tabela.FieldByName( 'Nome_do_Time' ).AsString );        Tabela.Next;    End;    Randomize;    While Not wTimes.Count = 0 Do Begin        wI := Random( wTimes.Count ) - 1;        wTimesRandom.Add( wTimes[wI] );        wTimes.Delete( wI );    End;    FreeAndNil( wTimes );End;

Pronto, dessa forma, os times estarão randomizados em wTimesRandom...

 

[]'s,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenho dois adendos à dica do Gabriel. A instrução [wI := Random( wTimes.Count ) - 1;] poderá retornar um número negativo para indexar na lista, pois Random retornará 0 <= wI < wTimes.Count. O correto é [wI := Random(wTimes.Count) ;]

 

Agora funcionará, mas tem um "bottleneck" de performance, porque deletando um item no meio da lista fará com que um possivelmente grande quantidade de ítems seja movida pra baixo(cima, dependendo do ponto de vista). Acho que neste caso não haverá muita diferença, mas nos caso em que faz, o melhor é trocar a posição do ítem escolhido pelo último, e em seguido deletá-lo.

 

Neste exemplo, o "Delete" é feito virtualmente

var  ...  Max: Integer;begin  ...  wTimesRandom := TStringList.Create;  wTimesRandom.Capacity := wTimes.Count;  Max := wTimes.Count;  while Max > 0 do  begin    Indice := Random(Max);    wTimesRandom.Add(wTimes[Indice]);    Dec(Max);    wTimes.Exchange(Indice, Max);  end;  ...end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beppe, obrigado pela correção, e só pra saber: O Random não retorna de 1 ao número indicado no parâmetro?É porque se eu não fizer o -1 no número final, ele pode escolher o último número, e na TStringList, o item correspondente ao número TStringList.Count, não existe... Portanto, ele dará 'Index out of bonds'... Isso porque o primeiro item da TStringList é o 0...[]'s,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gabriel, Random(x) sempre retornará um número entre 0 e x - 1, inclusive. Mas nunca tentei passar 0 como x, mas acredito que resultará num EDivByZero, se bem me lembro da implementação.Então Random(TStrings.Count) pode ser usado para indexar uma TStrings.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.