Ver Mensaje Individual
  #37  
Antiguo 17-04-2018
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Reputación: 11
bucanero Va camino a la fama
Cita:
Empezado por danielmj Ver Mensaje
Parece que recorre la lista3 y lo compara con per pero incluso habiendo una combinación real de 5 aciertos sigue sin encontrarla...
El problema yo lo veo en el proceso que te rellena el listbox llamado PER con la función combinatoria2 que lo único que hace es cambiar el orden de una combinación de numeros entre ellos, pero que al aplicar la función ValorCombinacion te va a devolver siempre el mismo valor de combinación, independientemente del orden de los elementos.

De hecho haz la siguiente prueba, ejecuta este procedimiento y veras como a cada permutación de tu lista PER obtienes el mismo valor en la función ValorCombinacion, y eso solo te hace repetir cálculos innecesarios una y otra vez

Código Delphi [-]
procedure TEST;
var 
  i: longint;
begin
  // llama aqui a la funcion que te rellena el listbox PER 
  // combinatoria2([1, 4, 5, 12, 24], PER.Items);
  Memo1.Clear;
  with Per do begin
    for i := 0 to Count - 1 do begin
      //convierto el string separado por espacios a una lista
      list.Clear;
      list.delimitedText := items[i];
      //mostrar resultado
      Memo1.Lines.Add(items[i] + #9 + IntTostr(ValorCombinacion(list)));
    end;
  end; 
end;

Creo que no necesitas ni el listbox PER ni la función que te lo rellena. Para generar una combinación aleatoria yo usaría algo así:

Código Delphi [-]

const 
  maxNum:integer=49; //<-- Numero maximo de elementos

var
  combinacion:Int64;

 ...
 for N1 := 1 to maxNum - 5 do
    for N2 := N1 + 1 to maxNum - 4 do
      for N3 := N2 + 1 to maxNum - 3 do
        for N4 := N3 + 1 to maxNum - 2 do
          for N5 := N4 + 1 to maxNum - 1 do
            for N6 := N5 + 1 to maxNum do begin
              //codifica la combinacion en un Int64
              combinacion := ValorCombinacion(n1, n2, n3, n4, n5, n6);
              analizarCombinacion(combinacion);
            end;
  ...

Y todo fuera de los componentes visuales.

Yo te recomiendo que para separar toda la parte visual de los cálculos, utilices un datamodule o una simple unidad independiente para meter todos los procesos referentes a calculo y en el formulario solo dejes la parte visual.

Y por tema de velocidad en el tipo de rutinas que hacen calculos de forma masiva, intentan en la medida de todo lo posible no hacer llamadas a elementos visuales ni refresco de la información de los mismos, pues son rutinas que se pueden ejecutar varios millones de veces, y las llamadas a componentes visuales son muy lentas, a parte de que te pueden dejar muy tirado el programa.

Cita:
Empezado por danielmj Ver Mensaje
Código Delphi [-]
procedure TForm1.CompararCombinaciones(const Cad1, cad2:Int64);
...
  label21.Caption:= IntToStr(cad1);
...
    ShowMessage('Iguales');
...
end;
Un saludo
Responder Con Cita