random y memoria
Publicado por palvji (12 intervenciones) el 10/01/2008 12:55:39
Buenas. Mi problema es el siguiente:
Tengo un procedimiento para dar valor aleatorio a los campos de una ficha (numero y color). Este procedimiento se basa en la función RANDOM y es el siguiente:
PROCEDURE Generar_Ficha (VAR Ficha:tFicha);
VAR
a:INTEGER;
BEGIN
RANDOMIZE;
REPEAT
a:=RANDOM (4);
UNTIL (a<>0);
Ficha.Numero:=a;
a:=RANDOM (6);
CASE a OF
0: Ficha.Color:=Blanco;
1: Ficha.Color:=Rojo;
2: Ficha.Color:=Verde;
3: Ficha.Color:=Azul;
4: Ficha.Color:=Amarillo;
5: Ficha.Color:=Violeta;
END;
END;
Sé que funciona, pues lo he probado varias veces. El problema viene cuando quiero rellenar asi todo el tablero y hago:
BEGIN
FOR i:=1 TO 8 DO
FOR j:='A' TO 'H' DO
Generar_Ficha (Tablero[i,j]);
Mostrar_Tablero (Tablero);
readkey;
END.
En el tablero que me muestra, todas las fichas son del mismo color y tienen el mismo numero.
Tras varias pruebas he visto que es por llamar al procedimiento Generar_Ficha tan seguido, pero he de hacerlo para rellenar el tablero.
Se me ocurrió meter una instrucción debajo de la llamada a Generar_Ficha, para ver si cambiaba algo al mantener ocupada a la CPU. Puse un Delay (1) y cambio, pero no lo suficiente. Aparecían 8 o 9 fichas iguales y luego otras 8 o 9 distintas a las anteriores, pero iguales entre sí. Con un Delay (10) ya si que obtengo el resultado esperado, pero no me parece que sea el método más ortodoxo.
Si se puede borrar la memoria del Random o algo asi, agradeceré cualquier ayuda.
Saludos
Tengo un procedimiento para dar valor aleatorio a los campos de una ficha (numero y color). Este procedimiento se basa en la función RANDOM y es el siguiente:
PROCEDURE Generar_Ficha (VAR Ficha:tFicha);
VAR
a:INTEGER;
BEGIN
RANDOMIZE;
REPEAT
a:=RANDOM (4);
UNTIL (a<>0);
Ficha.Numero:=a;
a:=RANDOM (6);
CASE a OF
0: Ficha.Color:=Blanco;
1: Ficha.Color:=Rojo;
2: Ficha.Color:=Verde;
3: Ficha.Color:=Azul;
4: Ficha.Color:=Amarillo;
5: Ficha.Color:=Violeta;
END;
END;
Sé que funciona, pues lo he probado varias veces. El problema viene cuando quiero rellenar asi todo el tablero y hago:
BEGIN
FOR i:=1 TO 8 DO
FOR j:='A' TO 'H' DO
Generar_Ficha (Tablero[i,j]);
Mostrar_Tablero (Tablero);
readkey;
END.
En el tablero que me muestra, todas las fichas son del mismo color y tienen el mismo numero.
Tras varias pruebas he visto que es por llamar al procedimiento Generar_Ficha tan seguido, pero he de hacerlo para rellenar el tablero.
Se me ocurrió meter una instrucción debajo de la llamada a Generar_Ficha, para ver si cambiaba algo al mantener ocupada a la CPU. Puse un Delay (1) y cambio, pero no lo suficiente. Aparecían 8 o 9 fichas iguales y luego otras 8 o 9 distintas a las anteriores, pero iguales entre sí. Con un Delay (10) ya si que obtengo el resultado esperado, pero no me parece que sea el método más ortodoxo.
Si se puede borrar la memoria del Random o algo asi, agradeceré cualquier ayuda.
Saludos
Valora esta pregunta


0