PDA

Ver la Versión Completa : Numeros Aleatorio Irrepetibles en un Vector


martini002
06-06-2012, 00:17:57
Salud Amigos, donde quiera que se encuentren ;)

esta vez me presento con un problemita que mas alla del lenguaje
tiene su dificultad en la logica, que despues de mas de 48 horas
de analisis y ensayo y error no he podido resolver
y me gustaria conocer su punto de vista y su logica
ya que la mia se agoto :(

he estado haciendo esto por partes ya que estoy
construyendo el proyecto de programacion de este año
para la universidad, y el cual publicare aqui en el momento
de su culminacion, en agradecimiento a toda la ayuda
que me han prestado :)

Begin,

el problema es el siguiente,
necesito un vector donde se almacenen numeros aleatorios
en un rango determinado.
en este caso usaremos del 1 al 3

he intentado de todo, ensayo y error,
nuevos metodos de resolucion pero no le encuentro solucion,
esto es lo ultimo a lo que he llegado,
quedandose en un bucle infinito.
intentando analizar la cosa esta,
se aprecia que en el ciclo cuando empieza
el Repeat es donde comienza el bucle,

les agradeceria muchisimo su colaboracion
y su tiempo, para ayudarme a reestructurar si es necesario
este programita

Saludos,
Best,
Martin


var
Form1: TForm1;
Vector:Array[1..3] of integer;

implementation

{$R *.dfm}

procedure InicializarVector();
var
i:integer;
begin
for i:=1 to 3 do
begin
Vector[i]:=0;
end;

end;

Function Comprobar(Num:Integer):Boolean;
var
i:Integer;
begin
for i:=1 to 3 do
if Num=Vector[i] then
begin
Result:=True;
end
else
begin
Result:=False;
end;
end;

procedure TForm1.FormActivate(Sender: TObject);
var
i, NumRandom, Aux:integer;
begin
for i:=1 to 3 do
begin
Randomize;
NumRandom:=RandomRange(1,4);
Vector[i]:=NumRandom;
end;
Aux:=1;
i:=3;
while i>1 do
begin
repeat //Aqui es donde empieza la agonia...
Comprobar(Vector[i]);
if Comprobar(Vector[i])=True then
begin
Vector[i]:=Aux+1
end;
until Comprobar(Vector[i])=False;
i:=i-1;
end;



Edit1.Text:=IntToStr(Vector[1]);
Edit2.Text:=IntToStr(Vector[2]);
Edit3.Text:=IntToStr(Vector[3]);
end;

begin
InicializarVector;
end.

martini002
06-06-2012, 03:17:55
Listo ya lo arregle.
un amigo me hecho una mano,
y quedo mas sencillo de lo que esperaba :D


procedure TForm1.Button1Click(Sender: TObject);
var
i, NumRandom, Aux, j:integer;
begin
InicializarVector();
i:=1;
while i<=6 do
begin
NumRandom:=RandomRange(1,7);
Aux:=0;
for j:=1 to 6 do
begin
if vector[j]=NumRandom then
begin
Aux:=1;
end;
end;
if Aux=0 then
begin
Vector[i]:=NumRandom;
end;
if vector[i]>0 then
begin
i:=i+1;
end;
end;
Edit1.Text:=IntToStr(Vector[1]);
Edit2.Text:=IntToStr(Vector[2]);
Edit3.Text:=IntToStr(Vector[3]);
Edit4.Text:=IntToStr(Vector[4]);
Edit5.Text:=IntToStr(Vector[5]);
Edit6.Text:=IntToStr(Vector[6]);
end;

martini002
06-06-2012, 04:26:46
Woah que brujeria es esta Ecfisa? :D
que practico, creo que lo implementare,

if v[n] = 0 then

me parecio muy adecuado usar eso,
practicamente lo estas engañando
excelente respuesta, gracias como siempre
saludos

Casimiro Notevi
06-06-2012, 09:19:33
Recuerda que la primera posición de un array es el cero, no el uno.

ecfisa
06-06-2012, 10:29:49
Hola martini002.

Pido disculpas, pero internet me ha andado lento como una endemoniada tortuga :mad:.
Dupliqué los mensajes y pensé en que había borrado solamente el duplicado pero borré ambos, luego se cortó.

De todos modos el código era algo parecido a este:

procedure TForm1.Button1Click(Sender: TObject);
var
v: array[1..6] of integer;
c,n: Integer;
begin
// Inicializar
for c:= 1 to 6 do v[c]:= 0;
Randomize;
// Carga
c:= 0;
repeat
n:= Random(6)+1;
if v[n] = 0 then
begin
v[n]:= n;
Inc(c);
end;
until c = 6;
// Mostrar
Edit1.Text:=IntToStr(v[1]);
Edit2.Text:=IntToStr(v[2]);
Edit3.Text:=IntToStr(v[3]);
Edit4.Text:=IntToStr(v[4]);
Edit5.Text:=IntToStr(v[5]);
Edit6.Text:=IntToStr(v[6]);
end;


La comprobación
if v[n] = 0 then
es para verificar que no haya sido asignado un valor a esa posición del arreglo, lo mismo podría haberse inicializado a cualquier valor arbirtrario no contemplado en el rango aleatorio y comprobar por ese valor.


Saludos. :)

Edito: Es una opción que no repite los números aleatorios dentro del arreglo pero no sé si es lo que te solicitaron por que no entendí muy bién la consigna.

martini002
07-06-2012, 00:35:02
Recuerda que la primera posición de un array es el cero, no el uno.

Lei este comentario ayer y no le di mucha importancia,
es mas me dejo un poco pensativo...
Pero hasta hace un minuto atras pense toda la vida
que podia declarar el vector desde:

V:Array[1..N]of Integer;

pero no es asi,
realmente nunca habia tenido problema con esta
situasion, pero en este momento lo he comprobado.
lo habia declarado asi:

V:Array[1..N]of Integer;

y la primera tupla me la marca en 0 con:


for i:=1 to N do
VCartas[i]:=i;


0 2 3 4 .. N

luego de haberlo cargado con una secuencia
y debia empezar desde 1.

Probe declarar el vector desde 0

V:Array[0..N]of Integer;

y ha cargado correctamente desde 1 con:


for i:=1 to N do
VCartas[i]:=i;


1 2 3 4 .. N

Interesante para analizar,
gracias por el TIP Casimiro

Saludos