Hola! ayer mismo me bajé la versión Bennupack 2.9 y al ir a hacer un pequeño programita veo que la función rand me da una respuesta inesperada, os copio el texto completo, (es una modificación de un tutorial). El caso es que me la expresión
rand(7,77) siempre me devuelve el resultado 48, en lugar de devolver valores aleatorios. Agradecería si alguien me puede explicar qué estoy haciendo mal.
//-------------------------------------------------------------------
// Autor: SORTEO SANTA MAGDALENA SOFIA 2018
//-------------------------------------------------------------------
PROGRAM Tutorial_1;
local
numero1;
BEGIN
load_fpg("media\tutor1.fpg");
set_mode(m800x600); // Selecciona el modo de video 640 x 480
put_screen(0,63); // Pone la pantalla de fondo
nave(320,240,41); // Crea el proceso nave
teclado();
sorteo();
FROM x=1 TO 8; asteroide(); END
END
process teclado();
begin
WRITE(0,100,77,0, "sorteo magdalena sofia" );
loop
if (key(_esc)) exit(); end;
frame;
end;
end;
process sorteo();
begin
numero1=RAND(7,77);
WRITE(0,100,87,0, "1" );
WRITE(0,100,97,0, numero1 );
loop
if (key(_esc)) exit(); end;
frame;
end;
end;
//-------------------------------------------------------------------
// Maneja la nave protagonista
//-------------------------------------------------------------------
PROCESS nave(x,y,graph)
BEGIN
LOOP
IF (key(_left)) angle=angle+10000; END
IF (key(_right)) angle=angle-10000; END
IF (key(_up)) advance( 8) ; END
FRAME; // Hace aparecer el gr fico de la nave en pantalla
END
END
//-------------------------------------------------------------------
// Proceso asteroide
//-------------------------------------------------------------------
PROCESS asteroide()
BEGIN
LOOP
x=0; y=0; graph=1;
angle=rand(-180000,180000);
WHILE (x>=0 AND x<=640 AND
y>=0 AND y<=480)
graph=graph+1;
IF (graph==21) graph=1; END
advance(4);
FRAME; // Hace que el gr fico salga en pantalla
END
END
END
Para conseguir resultados aletorios, debes iniciar la semilla de aleatoriedad al principio de la ejecución:
http://wiki.bennugd.org/index.php?title=Rand_seed
Gracias Panreyes, he conseguido que me busque números aleatrorios, pero ahora tengo el problema de que quiero mediante la instrucción FROM hacer una lista con números aleatorios, y lo que obtengo son 7 números iguales, esto es lo que he escrito, Qué tendría que hacer para que me devuelva un número distinto cada vez?
from cuenta=0 to 7 step 1;
rand_seed(time());
numero1=RAND(7,77);
WRITE(0,100,87,0, "1" );
WRITE(0,cuenta*23,97,0, numero1 );
end;
loop
No es necesario que ejecutes rand_seed más de una vez :)
Ok pero podrías explicarme porque en este ejemplo la variable número 1 imprime 7 valores iguales?
porque rand_seed inicia la semila con la que rand calcula el numero, si ejecutas rand_seed antes de cada rand, y pasando time() como parametro, vas a obtener el mismo numero en rand durante (al menos) el mismo segundo
por otro lado, el write que no tiene modificacion, no hay que meterlo dentro del for... cada vez que haces un write creas un objeto que se dibuja en pantalla... y se mantiene hasta que lo elimines... no tiene sentido meter un write en un for sin borrarlo, y ademas es contraproducente, ya que consume recursos, se va creando y creando una y otra vez.
Ya he solucionado el problema sacando rand eres del for, gracias a los dos.
Por otro lado el poner write dentro de un for me ha funcionado bien, estoy haciendo una simulación de un sorteo y lleno la pantalla de datos.
Quote from: juanpe on April 30, 2018, 06:25:26 PM
Ya he solucionado el problema sacando rand eres del for, gracias a los dos.
Por otro lado el poner write dentro de un for me ha funcionado bien, estoy haciendo una simulación de un sorteo y lleno la pantalla de datos.
por supuesto que va a funcionarte el write dentro del for, pero eventualmente se quedara sin memoria o sin textos disponibles y la aplicacion se cerrara... no es prolijo hacerlo de ese modo... no, si no lo borras en cada frame...
Ya te entiendo Splinter, de hecho al finalizar el programa y utilizar muchos más datos he utilizado el write fuera del for.
Gracias de nuevo.
de nada