el rand es rand pero con el rango que el quiere

Started by Danielo515, September 09, 2008, 04:47:35 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Danielo515

Si amigos, tengo un rand que siempre complace a la condición que tiene debajo, no se si es que se han liado o que. El caso es que esta línea



[code language="bennu"]crear=rand(0,200);
if(crear<=miniradar_probabilidad)
[/code]

Provoca que crear de un número aleatorio pero siempre dentro del rango (0,miniradar_probabilidad) en vez de (0,200)
¿por que pasa esto? uso la versión 0.93.

SplinterGU

q hay despues del if?


Program test;
Private
    b[41];
    i;
    n=0;
Begin
    set_mode(640,480,16);
    rand_seed(time()*10);
    n++;
    from i=0 to 41;
        b[i]=rand(0,200);
    end

    from i=0 to 20;
        write_int(0,100,10+i*10,0,&b[i*2]);
        write_int(0,200,10+i*10,0,&b[i*2+1]);
    end

    while (!key(_ESC))
        if (key(_ENTER))
            rand_seed(time()*10+n);
            n=(n+1)%10;
        end
        if (key(_ENTER)||key(_SPACE))
            from i=0 to 41;
                b[i]=rand(0,200);
            end
            while((key(_ENTER)||key(_SPACE)))
                frame;
            end
        end
        Frame;
    End
End


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

Danielo515

[code language="bennu"]process creador_coches(jugador)
private
float tiempo;   
crear;
begin     
   file=fpg_minijuego;
   graph=1;
   y=20;
   
   switch(jugador)
      case 1: x=160; end
      case 2: x=320; end
      case 3: x=480; end
      case 4: x=640; end
   end
   
   write(0,x,y-3,4,jugador);
   write_var(0,x,y+3,4,crear);
   WRITE_VAR(0,x,y-10,4,timer[jugador]);
   repeat
      crear=rand(0,200);
      if(crear<=miniradar_probabilidad)
         vehiculo_miniradar(1,rand(miniradar_vel_min,miniradar_vel_max),jugador);
         timer[jugador]=0;
      end

     while(timer[jugador]<100)frame;end //esto garantiza que habrá al menos 1 segundo entre coche y coche

   until(ganador>0); //fin repeat cuando gane alguien
   
end //begin                   [/code]


este es el proceso.

SplinterGU

no se que valor tiene miniradar_probabilidad, pero por lo general el rand es disperso... o sea, ejecuta al azar elementos dentro de un rango que normalmente cumple con todos los valores con un orden "aleatorio"... la dispersion es mas o menos pareja... si queres una dispersion con tendencia deberias hacer operaciones combinatorias con varios rands, por ejemplo, sumar 2... o multiplicar entre si, y luego sacar el modulo para limitar a un valor maximo...

Tambien puedes buscar otros algoritmos rand... Bennu usa el de C...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Danielo515

No me debo haber explicado, aunque eso de otros algoritmos me interesa.

El valor de la variable probabilidad es indiferente, puede ser 49 o 70, el caso es que por algún motivo el rand siempre busca valores entre (0 y probabilidad) en vez de entre (0 y 200) por lo que la condición crear<probabilidad siempre es cierta, y eso no es lo que yo quiero, para eso pongo if(1).

SplinterGU

si importa el valor... porque si me decis que es 500 siempre va a dar cierto... o 199 es muy probable que de cierto...
proba el ejemplo que te puse, vas a ver que no es como decis... tampoco confundas velocidad con probabilidad, quizas estas ejecutando demasiados rands y parece que siempre da true porque crea muchos coches, pero tenes que ver cuantas veces no se cumple el if... yo pondria un else y un contador en el else y lo imprimiria...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Danielo515

Si te fijas splinter, sí que pongo el valor del rand, y se actualiza una vez cada segundo y da tiempo de sobra a verlo. De hecho probé a poner probabilidad=1 y rand daba siempre igual a 0 y se seguía cumpliendo la condición, eternamente. Conozco como funciona rand y he utilizado estructuras similares en otros programas con muy buenos resultados, y no se que es lo que pasa ahora.

SplinterGU

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

Danielo515

No, no, miniradar_probabilidad no es float, aunque no está declarado. Hice un say antes y después del if con los valores de crear y este es el resultado

[code language="bennu"]
186 antes del if
186
157 antes del if
157
10 antes del if
10
134 antes del if
134
53 antes del if
53
66 antes del if
66
98 antes del if
98
186 antes del if
186
125 antes del if
125
157 antes del if
157
39 antes del if
39
174 antes del if
174
4 antes del if
4
182 antes del if
182
182 antes del if
182
158 antes del if
158
105 antes del if
105
100 antes del if
100
133 antes del if
133
99 antes del if
99
80 antes del if
80
136 antes del if
136
130 antes del if
130
117 antes del if
117
40 antes del if
40
166 antes del if
166
94 antes del if
94
63 antes del if
63
4 antes del if
4
71 antes del if
71[/code]

Si crear vale 71 la condición if(crear<=miniradar_probabilidad(que vale 1)) no debería ser cierta, ¿no?

SplinterGU

#9
Yo creo que no es asi...

Ejemplo, Bennu...

#ifndef __VERSION__
    import "mod_sdlevthandler";
#else
    import "mod_rand";
    import "mod_say";
    import "mod_video";
    import "libsdlhandler";
#endif

import "mod_timers";
import "mod_key";

global
miniradar_probabilidad = 75;

private
float tiempo;
crear;
begin
repeat
crear=rand(0,200);
if(crear<=miniradar_probabilidad)
    say (crear);
timer[0]=0;
    else
        say ("false");
end

      while(timer[0]<100&&!key(_ESC))frame;end //esto garantiza que habrá al menos 1 segundo entre coche y coche

    until(key(_ESC)); //fin repeat cuando gane alguien

say ("end");

end //begin


podes mostrar la declaracion de miniradar_probabilidad ?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Danielo515

splinter, he probado tu ejemplo, y , como es lógico, funciona perfectamente, no se que es lo que falla en el mío. ya para ponerte sólo la declaración, espero que no te  moleste, te pongo el código todo entero, es un inc, así que no  estan todas las funciones pero si creo las más importantes.

[code language="bennu"]global
     miniradar_vel_max=500;
     miniradar_vel_min=1;
    int miniradar_probabilidad=1; //la probabilidad de que aparezca un coche
     miniradar_vel_permitida;//la velocidad máxima permitida
     miniradar_altura_banda[4];
     miniradar_limite_superior[4];
     miniradar_limite_inferior[4];
     miniradar_multiplicador;
end


process velocimetro_miniradar(altura,velocidad,jugador);
private
   puntaje;
begin
   if(altura<miniradar_limite_superior && altura>miniradar_limite_inferior) //si está dentro de los límites de la foto
         if(velocidad>miniradar_vel_permitida)
            puntaje=velocidad*miniradar_multiplicador;
         else
                                puntaje=velocidad*miniradar_multiplicador*(-1);
         end
            
         puntos[jugador]+=puntaje;
   end //if de evaluación de límites
end //begin     



process foto_miniradar(jugador)
begin
frame;
end



Process vehiculo_miniradar(tipo,float velocidad,jugador);
Private
   pulsandoboton;
   fotos=1;   //valor máximo 1
   vel_G;
Begin
   file=0;
   velocidad=velocidad/100;
   graph=map_clone(fpg_minijuego,1);
   vel_G=write_in_map(0,velocidad,4);
   map_put(0,graph,vel_G,25,15);
   switch(jugador)
      case 1: x=160; end
      case 2: x=320; end
      case 3: x=480; end
      case 4: x=640; end
   end
         
      
      repeat
         y+=velocidad;
      
         if(botones[jugador] && fotos>0)
            velocimetro_miniradar(y,velocidad,jugador);
            foto_miniradar(jugador);
            fotos--;
         end     
         frame;
      until(y<0);
      
      

   //explosión de las naves o algo
End   
   
      
         
process creador_coches(jugador)
private
float tiempo;   
int crear;
begin     
   file=fpg_minijuego;
   graph=1;
   y=20;
   
   switch(jugador)
      case 1: x=160; end
      case 2: x=320; end
      case 3: x=480; end
      case 4: x=640; end
   end
   
   write(0,x,y-3,4,jugador);
   write_var(0,x,y+6,4,crear);
   WRITE_VAR(0,x,y-10,4,timer[jugador]);
   repeat
      crear=rand(0,200);
      say(crear+" antes del if");
      
      if( crear << 10 )
         vehiculo_miniradar(1,rand(miniradar_vel_min,miniradar_vel_max),jugador);
         timer[jugador]=0;
      else
      say("false");
      end
      
        say(crear);
     while(timer[jugador]<100)frame;end //esto garantiza que habrá al menos 1 segundo entre coche y coche

   until(ganador>0); //fin repeat cuando gane alguien
   
end //begin                   


process dificultad_miniradar();
private
tiempo_corto;
tiempo_largo;
tiempo_super;
begin
timer[5]=0;
repeat
   if(timer[5]>100)
      tiempo_corto++;
      tiempo_largo++;
      tiempo_super++;
   end
   
   if(tiempo_corto>=5)
      miniradar_vel_max+=10;
      tiempo_corto=0;
      
   end
   
   if(tiempo_largo>=10)
      miniradar_vel_min+=5;
      tiempo_corto=0;
      
   end 
   
   if(tiempo_super>=30)
   //aqui poner el cambio de escenario
   tiempo_super=0;
   end
   
   timer[5]=0;
   frame;
   
until(ganador>0)
end


Process miniradar();
Begin
   // RECURSOS
    fpg_minijuego=LOAD_FPG("minialunizaje.fpg");
   // COLOCAMOS OBJETOS EN PANTALLA Y PREPARAMOS EL MINIJUEGO
   drawing_map(0,0);   //dibujamos en el fondo un suelo verde
   drawing_color(200);
   draw_box(0,400,800,600);
   from i=1 to jugadores; creador_coches(i); end //creamos los creadores XD
   // PREPARADOS, LISTOS...
   getready();
   // YA! 
   dificultad_miniradar();
   while(ganador==0) frame; end //aquí nos quedamos hasta que gane alguien
   // ESPERAMOS UNOS SEGUNDOS Y SALIMOS DEL MINIJUEGO
   frame(5000); //esperamos un poquico
   menu(1); //y salimos del minijuego
End

               
[/code]

HaCkZJuaNN

dos cosas. La primera, te recomiendo que pongas los tipos de todas las variables, especialmente las de los parametros de los procesos y funciones, ya que eso te puede dar muchos problemas, no siempre se presupone que es int si se omite, sino el último tipo que declaraste, o algo así... lo mejor es ponerlo siempre en todas las variables. La segunda, el <<, sé que significa mucho menor en matemáticas(creo), pero en bennu no sé como actúa... me suena que en c es algo de los bits... por qué lo has usado???

SplinterGU

#12
<< es rotacion de bits... eso no es comparacion... obviamente eso te dara true...

cuando uno pone un ejemplo de algo que supuestamente falla, hay que tratar de ponerlo tal cual lo esta usando...

PD: Danielo515, revisa tus PMs...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Danielo515

#13
Lo he usado porque ya estaba desesperado, con la versión normal tampoco funcionaba. Normalmente pongo todos los tipos de variables, pero me estava volviendo algo vago. Mejoraré eso.

Bueno, he quitado la rotación de bits y sigo teniendo el mismo problema.

SplinterGU

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