Te dejo por aquí otro ejemplo en donde he creado una especie de clase llamada TCOMBINACION con las posibles funciones que necesitas y donde puedes ver su funcionamiento.
Es unidad totalmente independiente y sin enlaces a la parte visual de la aplicación
Código Delphi
[-]
unit Combinaciones;
interface
type
TCombinacion = Int64;
TCombinacionHelper = record helper for TCombinacion
private
function GetNumero(ANum: byte): Boolean;
function AsString(const value: TCombinacion): string; overload;
function GetCount: Integer;
public
procedure AddNumero(const ANum: byte); procedure aleatorio; function AsString: string; overload; procedure clear; function comparar(const combinacion: TCombinacion): Tcombinacion;
function obtenerComunes(const combinacion: Tcombinacion): string;
property Count:Integer read GetCount; property Numero[ANum:byte]:Boolean read GetNumero;
published
function load(list: array of Byte): boolean; overload; end;
implementation
uses System.SysUtils;
const
NumeroMax: Byte = 49; MaxCount: integer = 5;
procedure TCombinacionHelper.AddNumero(const ANum: byte);
begin
Self := self or (int64(1) shl ANum);
end;
procedure TCombinacionHelper.aleatorio;
var
i: longint;
value: Byte;
begin
i := 0;
clear;
repeat
value := Random(NumeroMax - 1) + 1;
if not Numero[value] then begin
AddNumero(value);
Inc(i);
end;
until (i >= MaxCount);
end;
function TCombinacionHelper.AsString: string;
begin
result := AsString(Self);
end;
procedure TCombinacionHelper.clear;
begin
Self := 0;
end;
function TCombinacionHelper.comparar(
const combinacion: TCombinacion): Tcombinacion;
begin
Result := self and combinacion;
end;
function TCombinacionHelper.GetCount: Integer;
var
aux: Int64;
begin
Result := 0;
aux := self;
while (aux > 0) do begin
if (aux and Int64(1)) = 1 then
Inc(result);
aux := aux shr 1;
end;
end;
function TCombinacionHelper.GetNumero(ANum: byte): Boolean;
begin
Result := ((self and (int64(1) shl ANum)) <> 0);
end;
function TCombinacionHelper.load(list: array of Byte): boolean;
var
i: LongInt;
begin
Result := False;
clear;
if length(list) = MaxCount then begin
for i := 0 to High(list) do
AddNumero(list[i]);
Result := true;
end;
end;
function TCombinacionHelper.obtenerComunes(
const combinacion: Tcombinacion): string;
begin
Result := Comparar(combinacion).AsString;
end;
function TCombinacionHelper.AsString(const value: TCombinacion):string;
var
i:integer;
begin
result := '';
for i := 1 to NumeroMax do
if value.Numero[i] then
result := result + IntToStr(i) + ' ';
end;
end.
y en la pantalla principal se puede usar de la siguiente manera (solo hay dos botones y un memo):
Código Delphi
[-]
uses Combinaciones;
procedure TForm1.Button1Click(Sender: TObject);
var
Combinacion: TCombinacion;
begin
Combinacion.aleatorio;
memo1.lines.add(Combinacion.AsString + #9 + '(' + IntToStr(Combinacion.count) + ')');
end;
procedure TForm1.Button2Click(Sender: TObject);
var
cs1: string;
Combinacion1, Combinacion2: TCombinacion;
comunes: TCombinacion;
i: LongInt;
begin
if not Combinacion1.load([1, 5, 8, 13, 33]) then begin
MessageDlg('La combinacion no es valida!!!', mtError, [mbOK], 0);
exit;
end;
cs1 := Combinacion1.AsString;
for i := 1 to 100 do begin
Combinacion2.aleatorio;
comunes := Combinacion2.comparar(Combinacion1);
if comunes <> 0 then
memo1.Lines.Add(cs1 + #9 + Combinacion2.AsString + #9 + '(' + IntToStr(comunes.count) + ') ' + comunes.AsString);
end;
end;