Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-06-2010
Ruben_21 Ruben_21 is offline
Miembro
 
Registrado: dic 2007
Posts: 17
Poder: 0
Ruben_21 Va por buen camino
Numeros Aleatorios

Hola gente como va todo?

La duda que tengo es mas bien algoritmica que de delphi propiamente.

Resulta que tengo que ir almacenando numeros aleatorios a partir de un rango de numeros que me de el usuario sin repetir los numeros que ya han salido.

Para hacerme entender les doy un ejemplo:

Si me dan un rango entre 0 y 100. El primer numero aletorio que me sale es 24. Bien ahora para el segundo ciclo me tiene que tirar un numero entre 0 y 100 que no sea el 24. Por ejemplo sale el 87. Ahora el tercer ciclo me tiene que dar un numero aleatorio entre 0 y 100 que no sea ni 24 ni 87. Asi sucesivamente hasta que me salgan 100 numeros.

Uso las funciones Randomize y Random (). No tengo ningun problema en usarlas el problema es que no se como hacer para que no salgan los numeros que ya salieron en los ciclos anteriores.

Cualquier idea sera agradecida.

Saludos.
Responder Con Cita
  #2  
Antiguo 04-06-2010
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Random te va a devolver números repetidos, pero puedes hacer dos cosas:

- Llevar la lista de los nros salidos y si el número sorteado esta repetido, volver a sortear hasta que salga uno no repetido.

- LLevar una lista con los números del 0 a 100, sortear un numero en este rango y borrarlo de la lista, luego sortear un numero en el rango de la cantidad de nros de la lista, seguir así hasta que no queden nros en la lista.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 04-06-2010
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola Ruben, yo lo haría de la primera forma que indica delphi.com.ar, te pongo un ejemplo utilizando un StringList.

Código Delphi [-]
 sl : TStringList;
 
 ..........................
 ..........................
 Band : Boolean;
begin
 Randomize;
 Rango := 100; 

 Band := True;
 While Band and (sl.Countdo
 begin
  Num := Random(Rango);
  if (sl.IndexOf(IntToStr(Num))=-1)  then
   begin
    sl.Add(IntToStr(Num));
    Band := False;
    showmessage(IntToStr(Num));
   end;
 end;
end;

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #4  
Antiguo 04-06-2010
Avatar de Lord Delfos
Lord Delfos Lord Delfos is offline
Miembro
 
Registrado: ene 2008
Ubicación: Tandil, Argentina
Posts: 558
Poder: 17
Lord Delfos Va por buen camino
Otra forma de hacerlo es generar los números primero, ordenados, y después desordenarnos con random mezclando los índices.

Código Delphi [-]
var Numeros: array of Integer;
     Ind1, Ind2, Cuenta: Integer;
     Aux: Integer;

begin
  // Genero los números
  SetLength(Numeros, 101);
  for Cuenta:= 0 to 100 do Numeros[Cuenta]:= Cuenta;

  // Y los mezclo
  Randomize;
  for Cuenta:= 0 to 101 * 3 do
    begin
    Ind1:= Random(101);
    Ind2:= Random(101);
    Aux:= Numeros[Ind1];
    Numeros[Ind1]:= Numeros[Ind2];
    Numeros[Ind2]:= Aux;
    end;
end;

Queda desprolijo, pero... No hay mucho que hacerle. El problema de le veo a lo te dijo Caro y delphi.com.ar es que el último número o los últimos van a tener muchos iteraciones antes de que salga justo el que uno no tiene... Está bien, mi idea también tiene un ciclo del triple del tamaño del arreglo, así que...

Qué sé yo.

Saludongos.
Responder Con Cita
  #5  
Antiguo 04-06-2010
Ruben_21 Ruben_21 is offline
Miembro
 
Registrado: dic 2007
Posts: 17
Poder: 0
Ruben_21 Va por buen camino
Bueno en primer lugar gracias a todos por las respuestas. Las he probado pero no las puede hacer andar... siempre que pruebo algo me sale un error en tiempo de ejecucion sobre violacion de memoria o no se que, parece que hay overflow en algun lugar o no se. La verdad no pense que un problema tan simple se transforme en algo tan complejo (para mi).

Les cuento como viene la mano con mi duda.

Tengo que hacer un sorteo para hacer una clasificacion de una carrea de autos. Entonces dada la cantidad de participantes (que es ingresada por el usuario) tiene que salir aleatoriamente en orden clasificara cada piloto. El problema mas groso viene cuando genero un numero aletorio este no debe ser 0 porque las posiciones de clasificacion empiezan de 1 en adelante.

Ej: Son 10 pilotos, lo que el programa me deberia devolver en un Tmemo seria

En 1º Lugar Clasifica el piloto Nº 9
En 2º Lugar Clasifica el piloto Nº 2
En 3º Lugar Clasifica el piloto Nº 5
Y asi sucesivamente hasta que diga
En 10º Lugar Clasififica el piloto Nº8

Lo que tengo que conseguir aleatorimente es el Numero de piloto (que no puede ser cero).

Bueno. Por si alguien sabe.. podria ser tan amable?. Si no gracias de todos modos por las respuestas que me dieron, intentare ver como hago.

Saludos.

Última edición por Ruben_21 fecha: 04-06-2010 a las 22:08:51.
Responder Con Cita
  #6  
Antiguo 05-06-2010
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Cita:
Empezado por Ruben_21 Ver Mensaje
El problema mas groso viene cuando genero un numero aletorio este no debe ser 0 porque las posiciones de clasificacion empiezan de 1 en adelante.
Ese problema tan groso tiene una solución tan sencilla como sumarle "1" al resultado del random y restarle "1" al rango. O utilizar la queridísima función "RandomRange".

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #7  
Antiguo 10-06-2010
Ruben_21 Ruben_21 is offline
Miembro
 
Registrado: dic 2007
Posts: 17
Poder: 0
Ruben_21 Va por buen camino
Hola a todos que tal... aca posteo la solucion. Por si a alguien le sirve. Gracias a todos por las respuestas.

Saludos.
Código Delphi [-]procedure TForm1.Button4Click(Sender: TObject); var Ind1:Integer; Ind2:Integer; Cuenta:Integer; Aux:Integer; Cuenta2: Integer; begin CantidadParticipantes:=strtoint(Edit1.Text); CantidadParticipantes:=CantidadParticipantes+1; Form2.Memo1.Clear; SetLength(Participantes,CantidadParticipantes+2); for Cuenta:=1 to CantidadParticipantes do Participantes[Cuenta]:=Cuenta; Randomize; for Cuenta:=1 to (CantidadParticipantes+2)*3 do begin Ind1:=Random(CantidadParticipantes); if Ind1 = 0 then Ind1:=Ind1+1; Ind2:=Random(CantidadParticipantes); if Ind2 = 0 then Ind2:=Ind2+1; Aux:=Participantes[Ind1]; Participantes[Ind1]:= Participantes[Ind2]; Participantes[Ind2]:= Aux; end; for Cuenta2:=1 to CantidadParticipantes-1 do Form2.Memo1.Lines.Add(inttostr(Cuenta2)+'º Lugar Participante Nro: ' + inttostr(Participantes[Cuenta2])); Form2.ShowModal; Button4.Enabled:=False; Edit1.ReadOnly:=True; end;
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
numeros aleatorios no repetitivos d-hugo OOP 6 13-01-2008 15:35:18
Generación de Números Aleatorios DarkDrakon Varios 8 10-10-2006 17:33:06
Función números aleatorios Sarola Oracle 6 17-11-2005 22:26:02
Generador de números aleatorios gontxalo OOP 16 09-06-2005 22:38:07
numeros aleatorios emeritos Varios 1 24-11-2003 15:09:43


La franja horaria es GMT +2. Ahora son las 17:28:25.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi