
Números Aleatorios
Publicado por José Rodríguez (157 intervenciones) el 24/11/2005 15:36:28
Buenas, tengo un problema necesito hacer un programa que genere numeros aleatorios sin que se repitan tengo un codigo que lo hace perfectamente, pero el detalle es que cada vez que cierro el programa y lo vuelvo a ejecutar siempre me genera los mismo numeros aleatorios y quisiera que eso no sucediera aqui les dejo el codigo que consegui en una pagina de internet http://q3.nu/trucomania
unit uTAlea;
interface
uses
Windows, SysUtils;
type
{Array de Booleanos de Longitud Variable}
TArrayBool = Array [0..0] of Boolean;
PArrayBool = ^TArrayBool;
{Clase para manejar Números Aleatorios}
TAlea = class
Maximo: Integer; //Valor Máximo de los Números Obtenidos
Lista: PArrayBool;
FaltanDeSacar: Integer;
constructor Create (Rango: Integer);
destructor Destroy; override;
procedure Reset; //Resetea la Lista de Números
function PillaNumero: Integer; //Devuelve un Número aleatorio sin repetición
end;
implementation
constructor TAlea.Create (Rango: Integer);
begin
{
Si los Númerosa extraer no pueden ser repetidos
hemos de crear un array para almacenar cual ha salido y cual no
como el array ha de ser variable, usamos el GetMem y
los punteros
}
inherited Create;
Maximo := Rango;
FaltanDeSacar := Rango;
{Reservamos memoria para el array de longitud variable}
GetMem (Lista, 1 + Maximo * SizeOf (Boolean));
ZeroMemory (Lista, 1 + Maximo * SizeOf (Boolean));
end;
destructor TAlea.Destroy;
begin
if Assigned (Lista) then
FreeMem (Lista, 1 + Maximo * SizeOf (Boolean));
inherited Destroy;
end;
function TAlea.PillaNumero: Integer;
var
Numero: Integer;
begin
if FaltanDeSacar = 0 then
raise Exception.Create ('Error. No se puede sacar otro Número sin repetir');
{Buscamos un número que no haya salido}
repeat
Numero := Random (Maximo)
until not Lista^[Numero];
{Lo apuntamos en la Lista de Números ya usados}
Lista^[Numero] := True;
{Decrementamos la cantidad de números que faltan por salir}
Dec (FaltanDeSacar);
Result := Numero;
end;
procedure TAlea.Reset;
begin
ZeroMemory (Lista, 1 + Maximo * SizeOf (Boolean));
FaltanDeSacar := Maximo;
end;
end.
Gracias de antemano
unit uTAlea;
interface
uses
Windows, SysUtils;
type
{Array de Booleanos de Longitud Variable}
TArrayBool = Array [0..0] of Boolean;
PArrayBool = ^TArrayBool;
{Clase para manejar Números Aleatorios}
TAlea = class
Maximo: Integer; //Valor Máximo de los Números Obtenidos
Lista: PArrayBool;
FaltanDeSacar: Integer;
constructor Create (Rango: Integer);
destructor Destroy; override;
procedure Reset; //Resetea la Lista de Números
function PillaNumero: Integer; //Devuelve un Número aleatorio sin repetición
end;
implementation
constructor TAlea.Create (Rango: Integer);
begin
{
Si los Númerosa extraer no pueden ser repetidos
hemos de crear un array para almacenar cual ha salido y cual no
como el array ha de ser variable, usamos el GetMem y
los punteros
}
inherited Create;
Maximo := Rango;
FaltanDeSacar := Rango;
{Reservamos memoria para el array de longitud variable}
GetMem (Lista, 1 + Maximo * SizeOf (Boolean));
ZeroMemory (Lista, 1 + Maximo * SizeOf (Boolean));
end;
destructor TAlea.Destroy;
begin
if Assigned (Lista) then
FreeMem (Lista, 1 + Maximo * SizeOf (Boolean));
inherited Destroy;
end;
function TAlea.PillaNumero: Integer;
var
Numero: Integer;
begin
if FaltanDeSacar = 0 then
raise Exception.Create ('Error. No se puede sacar otro Número sin repetir');
{Buscamos un número que no haya salido}
repeat
Numero := Random (Maximo)
until not Lista^[Numero];
{Lo apuntamos en la Lista de Números ya usados}
Lista^[Numero] := True;
{Decrementamos la cantidad de números que faltan por salir}
Dec (FaltanDeSacar);
Result := Numero;
end;
procedure TAlea.Reset;
begin
ZeroMemory (Lista, 1 + Maximo * SizeOf (Boolean));
FaltanDeSacar := Maximo;
end;
end.
Gracias de antemano
Valora esta pregunta


0