Problema con la función Rand

Started by juanpe, April 29, 2018, 04:29:53 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

juanpe


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

panreyes

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

juanpe


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   

panreyes

No es necesario que ejecutes rand_seed más de una vez :)

juanpe

Ok pero podrías explicarme porque en este ejemplo la variable número 1 imprime 7 valores iguales?

SplinterGU

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
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

juanpe

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.

SplinterGU

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...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

juanpe

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.

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2