Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Numeros Aleatorios (https://www.clubdelphi.com/foros/showthread.php?t=68269)

Ruben_21 04-06-2010 15:36:44

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.

delphi.com.ar 04-06-2010 15:46:00

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!

Caro 04-06-2010 16:47:17

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

Lord Delfos 04-06-2010 19:23:19

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.

Ruben_21 04-06-2010 21:05:47

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.

delphi.com.ar 04-06-2010 23:14:26

Cita:

Empezado por Ruben_21 (Mensaje 366228)
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!

Ruben_21 10-06-2010 22:40:18

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;


La franja horaria es GMT +2. Ahora son las 17:54:55.

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