Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (https://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   Revisión de código (https://www.clubdelphi.com/foros/showthread.php?t=93072)

danielmj 17-05-2018 14:49:55

Buenas, estoy haciendo pruebas con tu codigo Bucanero, y si bien funciona perfectamente, hay algo que me choca.. a veces se dan hasta 6 combinaciones iguales donde solo cambia un numero y me pregunto, desde el punto de vista estadistico ¿cual es la posibilidad de que ocurra eso realmente?


https://drive.google.com/open?id=13k...Yu0opkIBvkB2DY


Un saludo.

bucanero 17-05-2018 17:44:53

Cita:

Empezado por danielmj (Mensaje 526341)
a veces se dan hasta 6 combinaciones iguales donde solo cambia un numero y me pregunto, desde el punto de vista estadistico ¿cual es la posibilidad de que ocurra eso realmente?

A eso ya no te puedo responder... tendría que hacerlo un matemátic@.
Por lo que veo si estas comparando una combinación (maestra) de 6 números con otras combinaciones de 5 números esperando encontrar coincidencias para todos los números, entonces tendrás 6 combinaciones que cumplan ese requisito...
La pregunta es ¿Que probabilidades hay de que en 20 o 30mil combinaciones aleatorias aparezcan esas 6 combinaciones? pues la lógica dice que no muchas, aunque ten en cuenta que la combinación maestra la has obtenido de los números mas repetidos de esas combinaciones aleatorias.

Una cosa curiosa de la estadística con respecto a lo que pretendes buscar, es que si coges toda la tanda de datos históricos de sorteos de lotería primitiva y haces un recuento de los números que mas salen con respecto a los que menos salen, veras que las diferencias son mínimas, aquí te dejo los enlaces a los historicos
primitiva-resultados-historicos-de-todos-los-sorteos/

danielmj 17-05-2018 18:29:43

Hola por ahora ya lo dejo así, ire probando y dejaré para mas adelante implementar otras cosas como cargar un CSV con el registro de sorteos y comparar la clave maestra con ellos..

Un saludo y gracias

danielmj 22-05-2018 10:45:16

Buenos dias, sigo haciendo pruebas y alguna modificacion para la version de Windows, como generar un listView con x numero de combinaciones aleatorias y buscar los 6 mas repetidos para tomarlos como clave maestra (supongo que se me puede aplicar eso de R que R pero es lo que buscaba de un principio). En Windows va todo bien (excepto lo de atender al combobox, no lo he comprobado), hace lo que debe. Pero en Linux, me encuentro que cuando selecciono un valor del combobox por ejemplo 5000, en el listBox, solo aparecen 2885 y no sé por qué no antiende al case que por cierto es proporcional al valor del combo, es decir si selecciono 50.000 combinaciones, solo hace los calculos sobre 28684.

Código Delphi [-]
...
...
case comb.ItemIndex of
    0: //corresponde con el valor 5000
    begin
    listBox1.Clear;
    //repeat;
    listBox1.clear;
    setLength(list, 5000);
    //rellenar una list de 5000 elementos con una combinación aleatoria
    for i:=0 to high(list) do
      list[i].aleatorio2;

    //cargar la combinación maestra
    if not Combinacion1.load([1, 45, 33, 14, 20, 22]) then begin
      MessageDlg('La combinacion no es valida!!!', mtError, [mbOK], 0);
      exit;
    end;

    // guarda la combinacion1 en un string,
    // esto es solamente por acelerar el proceso a la hora de mostrar la combinacion
    // como string y no repetirlo en cada ciclo del bucle
    cs1 := '23 45 17 15 22 36'; //Combinacion1.AsString;
    //recorre el bucle para analizar todas las combinaciones con la combinacion principal
    for i := 0 to high(list) do begin
      /// compara una combinacion con otra y obtine los comunes a ambas combinaciones
      comunes := list[i].comparar(Combinacion1);
      /// si el valor es 0 entonces no hay numeros comunes
      if comunes <> 0 then
        //memo1.Lines.Add(cs1 + #9 + lista[i].AsString + #9 + '(' + IntToStr(comunes.count) + ') ' + comunes.AsString);
        listBox1.Items.Add(IntToStr(listBox1.Items.Count)+#9+'Maestra: '+cs1 + #9 + 'Aleatoria: '+list[i].AsString + #9 + '(' + IntToStr(comunes.count) + ') ' + comunes.AsString);
      if comunes = 5 then
      with lista.Items.Add do
      begin
        caption:= IntToStr(lista.items.count);
        subItems.Add(cs1);
        subItems.Add(list[i].AsString);
        subItems.Add(IntToStr(comunes.count));
      end;
    end;
    inc (int);
    {until lista.Items.Count > 1 ;
    label4.visible:= true;
    label4.Caption:='Realizadas '+IntToStr(int)+' pasadas.';
    panel1.Visible:= false;}
    end;

Y por otra parte, veo que en cs1, juega con una combinacion arbitraria:
Código Delphi [-]
cs1 := '23 45 17 15 22 36';
¿Como podría hacer lo mismo que en Windows, es decir generar x numero de combinaciones aleatorias y buscar los 6 mas repetidos para proporcionarle este dato a cs1?
Un saludo



bucanero 22-05-2018 22:35:47

Hola Daniel,

Vuelves a mezclar mucho código de distintas cosas generando un caos en el código... Divide y vencerás!! esa es la técnica que tienes que utilizar, haz pequeñas funciones o procedimientos donde realice las mínimas acciones posibles y minimices los posibles errores, en particular tu código que has puesto podría quedar algo así:

Código Delphi [-]
function TForm1.GetComboBoxValue: Integer;
begin
  result:=0;
  with combobox1, items do
    if Itemindex>=0 then
      try
        //Convierte la cadena del combo en un numero
        result:=StrToInt(Items[itemIndex]);
      except
      end;
end;

procedure TForm1.GenerarCombinacionesAleatorias(const Numero:Integer);
var
  i:longint;
begin
  setLength(listCombinaciones, Numero);
  for i:=0 to High(listCombinaciones) do
    listCombinaciones[i].aleatorio;
end;  

function TForm1.BuscarMejorcombinacion: Tcombinacion;
begin
  //cargar la combinación maestra
  ... 
end; 

procedure TForm1.Button9Click(Sender: TObject);
var
  NumeroDeElementos:Integer;
  CombinacionMaestra:TCombinacion;
begin
  //Obtiene el numero de elementos seleccionado por el usuario en el combobox
  NumeroDeElementos:=GetComboBoxValue;
  //Genera una lista de N elementos de combinaciones aleatorios, mostrándolas en un listbox
  GenerarCombinacionesAleatorias(NumeroDeElementos);
  // Obtiene la combinación maestra
  CombinacionMaestra:=BuscarMejorcombinacion;
  //compara las combinaciones aleatorias con la combinación maestra
  CompararCombinacionesAleatorias(CombinacionMaestra);
end;

no se por que utilizas aquí un case, Poner un case por cada opción del combobox ademas de no ser muy eficiente, es duplicar código y complicar el proceso
Cita:

Empezado por danielmj (Mensaje 526443)
Código Delphi [-]
...
...
case comb.ItemIndex of
    0: //corresponde con el valor 5000
    begin
  ...

¿Por que no te hace los ciclos que tu quieres? pues seguramente este asignando el numero de elementos de la variable list* incorrectamente.
*.- te recomiendo que a las variables importantes y mas o menos globales les pongas nombres descriptivos que a simple vista sean fácilmente identificable.

Y en cuanto a CS1:
Cita:

Empezado por danielmj (Mensaje 526443)
Y por otra parte, veo que en cs1, juega con una combinacion arbitraria:
Código Delphi [-]
cs1 := '23 45 17 15 22 36';

Esto no se por que lo has puesto así, CS1 solo es la representación en string de la combinación maestra, y se utiliza para no estar en cada ciclo repitiendo el proceso de convertir dicha combinación a string, combinación que una vez calculada ya no vuelve a cambiar nunca, y por ser un proceso relativamente lento, en definitiva para acelerar cada iteración
Código Delphi [-]
cs1 := CombinacionMaestra.AsString;

Casimiro Notevi 22-05-2018 23:30:19

Cita:

Empezado por danielmj (Mensaje 526443)
(supongo que se me puede aplicar eso de R que R ...)

:rolleyes:

Cita:

Empezado por bucanero (Mensaje 526470)
Vuelves a mezclar mucho código de distintas cosas generando un caos en el código... Divide y vencerás!! esa es la técnica que tienes que utilizar, haz pequeñas funciones o procedimientos donde realice las mínimas acciones posibles y minimices los posibles errores

^\||/


La franja horaria es GMT +2. Ahora son las 00:30:05.

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