Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Futu-block on May 29, 2011, 08:16:56 PM

Title: ¿Un random funciona dentro de un for?
Post by: Futu-block on May 29, 2011, 08:16:56 PM
Me está ''golviendome'' loco un proceso que tengo, para crear varios procesos dentro de un primer proceso uso un for...
[code language="bennu"]
proces tal1()
private
int v;
loop
    if (tal y tal...etc

    for (v = 1; v < 8; v++)
        tal2(rand(100,500), 300);
        frame(500);
    end
    ...
end


process tal2(x,y)
graph = etc...
[/code]

no me cuadra, siempre me crea el proceso en el mismo sitio; y eso que hay un rango de 400 pixeles...


en fin, sigo probando
Title: Re: ¿Un random funciona dentro de un for?
Post by: Fede on May 29, 2011, 08:29:50 PM
¿Inicializas la semilla? Yo normalmente lo hago con time.
Title: Re: ¿Un random funciona dentro de un for?
Post by: Futu-block on May 29, 2011, 08:31:28 PM
si, por supuesto
Title: Re: ¿Un random funciona dentro de un for?
Post by: SplinterGU on May 29, 2011, 08:33:01 PM
fijate que no tengas la inicializacion de la semilla dentro de un for o dentro de algun proceso que este corriendo mientras ejecutas este otro proceso que crea los procesos con rand.
Title: Re: ¿Un random funciona dentro de un for?
Post by: FreeYourMind on May 29, 2011, 08:33:27 PM
estas creando 7 procesos en realidad...
Title: Re: ¿Un random funciona dentro de un for?
Post by: Fede on May 29, 2011, 08:36:10 PM
Quote from: SplinterGU on May 29, 2011, 08:33:01 PM
fijate que no tengas la inicializacion de la semilla dentro de un for o dentro de algun proceso que este corriendo mientras ejecutas este otro proceso que crea los procesos con rand.

En otras palabras. Que a la semilla le de tiempo a inicializarse. :D
Title: Re: ¿Un random funciona dentro de un for?
Post by: Futu-block on May 29, 2011, 08:37:42 PM
si, quiero crear siete procesos en 'x' distintas y la semilla está por el 'time' en el proceso principal, antes de la invocacion del proceso (tal1)
Title: Re: ¿Un random funciona dentro de un for?
Post by: FreeYourMind on May 29, 2011, 08:41:21 PM
pon la semilla justo despues del BEGIN de programa principal, cuando defines la resolucion y solo una vez.
Title: Re: ¿Un random funciona dentro de un for?
Post by: Fede on May 29, 2011, 08:42:26 PM
¿Puedes poner el trocito de código de inicialización de la semilla?
Title: Re: ¿Un random funciona dentro de un for?
Post by: Futu-block on May 29, 2011, 08:47:03 PM
[code language="bennu"]
PROGRAM dragon;

INCLUDE "DLL/import.prg";
include "dragon/vari_glob.prg";
INCLUDE "dragon/ia_dragon.prg"; // inteligencia artificial del dragon
INCLUDE "dragon/gest_item.prg"; //gestion de items


BEGIN
   set_mode(320,240,32,mode_window);
   load_fpg("dragon/corrr.fpg");          
   fondo(); panta(); ia_draco(); arcos(); objetos();:
   rand_seed(time());
END                                  

process fondo()
begin


[/code]

asi??
Title: Re: ¿Un random funciona dentro de un for?
Post by: Fede on May 29, 2011, 08:53:20 PM
No sé quien llama a tal1 pero... ¿No deberías de poner el Rand_Seed en la primera línea? Esto es, despues del Begin mismo.
Title: Re: ¿Un random funciona dentro de un for?
Post by: Fede on May 29, 2011, 08:59:18 PM
Bueno chicos. La cama me reclama. ¡Suerte Futu! :D
Title: Re: ¿Un random funciona dentro de un for?
Post by: Futu-block on May 29, 2011, 09:00:27 PM
juo juo juo, disfruta del catre

stop a esto, estoy probando linea por linea y probando en el juego y parece que vá perfect...
que raro :(

lo que pasaba es que le estoy metiendo en un array y le estoy haciendo una comprobacion para que no me repita ningun numero, y ese es el otro lado donde me falla

la eliminacion de sentencias o la addiccion de nuevas de una en una me está ayudando


por cierto, como se pone en un array[7] ocho numeros distintos (del uno al ocho se supone)??
estoy poniendo un for dentro del for, pero creo que me estoy rayando
Title: Re: ¿Un random funciona dentro de un for?
Post by: FreeYourMind on May 29, 2011, 09:29:58 PM
el error es muy facil de ver, seteas la semilla despues de usar el rand en los procesos que llamas antes del mismo xDD
Title: Re: ¿Un random funciona dentro de un for?
Post by: Drumpi on May 29, 2011, 11:35:36 PM
Quote from: Futublock on May 29, 2011, 09:00:27 PM
por cierto, como se pone en un array[7] ocho numeros distintos (del uno al ocho se supone)??
estoy poniendo un for dentro del for, pero creo que me estoy rayando

for (i=0;i<=7;i++)
    array[i]=i;
end


Respecto a lo del random, además de lo que dicen los demás, asegúrate que  no estás asignando un valor a la X de tal2 antes del FRAME;
Title: Re: ¿Un random funciona dentro de un for?
Post by: SplinterGU on May 30, 2011, 01:44:44 AM
si el rand_seed esta 1 sola vez y fuera de un loop y en un proceso que se ejecuta solo 1 vez, no interesa si se llama antes o despues de usar el rand, aunque evidentemente si se lo llama despues de usar el rand, los valores del rand van a pertener a la semilla default, pero no deberian dar valores iguales.

como ya ha dicho futu, el error lo tiene en otro lado.
Title: Re: ¿Un random funciona dentro de un for?
Post by: Futu-block on May 30, 2011, 07:36:00 AM
PREMIO!!!!!!!!!!

El problema residia en el doble bucle para sacar numeros distintos dentro de un array

Quote from: Drumpi on May 29, 2011, 11:35:36 PM
Quote from: Futublock on May 29, 2011, 09:00:27 PM
por cierto, como se pone en un array[7] ocho numeros distintos (del uno al ocho se supone)??
estoy poniendo un for dentro del for, pero creo que me estoy rayando

for (i=0;i<=7;i++)
    array[i]=i;
end


Respecto a lo del random, además de lo que dicen los demás, asegúrate que  no estás asignando un valor a la X de tal2 antes del FRAME;

Remodifico para que me entiendas:
¿como se ponen en un array[7] ocho numeros aleatorios y distintos??
me pongo a hacerle otro for pero lo que pasa es que al comprobar si el numero es el mismo y poner otro aleatorio puede que no coincida con un siguiente pero si con uno anterior...

a ver si lo explico con pseudocodigo, para entenderlo mejor:

[code language="bennu"]for (del 1 al 7)

    array[correspondiente] = numero aleatorio (del 1 al 7);
    for (del numero correspondiente, hasta que llegue a 0, i--)
        if (array[correspondiente] == array[anterior])
            dar otro numero aleatorio (del 1 al 7);
        end
    end
    crea el proceso segun (array[correspondiente]) // ya yo reparto ese numero con la x del proceso
end[/code]

claro, en el segundo bucle for, al coincidir el numero en la posicion del array  con la anterior me dá un numero aleatorio nuevo, pero lo que pasa es que puede ser puede ser el mismo del posterior

me interesa que cada vez que me dé un numero aleatorio vuelva a repetir la comparacion; cuando estube en basic  se ponia ''go to 30'' (ir a la linea 30) puede usarse eso aqui tambien???
Title: Re: ¿Un random funciona dentro de un for?
Post by: gukan on May 30, 2011, 02:45:56 PM
Usando el mismo metodo que tu lanzando tantos rand como haga falta (que por 7 numeros no pasa nada pero en el caso de hacerlo algo mas grande, puede pasarse un rato si hay mala suerte con los numeros) el codigo creo que seria asi:
[code language="bennu"]for (correspondiente del 0 al 6)

   array[correspondiente] = numero aleatorio (del 1 al 7);
   i=correspondiente;
   while (i>0)
      i=i-1;
       if (array[correspondiente] == array)
           array[correspondiente] = numero aleatorio (del 1 al 7);
         i=correspondiente;
       end
   end
   crea el proceso segun (array[correspondiente]) // ya yo reparto ese numero con la x del proceso
end[/code]

La forma de asegurarte que haga tantos rands como iteraciones seria:

[code language="bennu"]int usado[7];
for (i=0;i<7;i++)
   array=rand(1,7-i);
   for (j=0;j<array;j++)
      if(usado[j]==1)
         array++;
      end;
   end
   usado[array-1]=1;
   crea el proceso segun (array) // ya yo reparto ese numero con la x del proceso
end[/code]
Aunque en este caso, si no me equivoco, creo que el array solo lo usas para seguir cuales has asignado ya y cuales no, con lo que se hace inecesario ya que en este codigo el control lo lleva el usado
Title: Re: ¿Un random funciona dentro de un for?
Post by: Futu-block on May 30, 2011, 03:44:19 PM
claro, usando un while...
estaba barajando usar un repeat until, pero no daba con la tecla, solo daba vueltas sobre un bloque for que no me llegaba a ningun sitio.

despues de mirar mis apuntes de basic me remitia a un cambio de linea que no me terminaba de gustar, no sabia como traducirlo a bennu

gracias karma++
Title: Re: ¿Un random funciona dentro de un for?
Post by: SplinterGU on May 30, 2011, 04:33:37 PM
ese algoritmo no es para nada bueno, puedes perder un monton de tiempo en tener todos los elementos con numeros diferentes.

yo llenaria el array con numeros del 1 al 7 (para eso necesitas un array[6], ya que empieza de 0) y luego mezclo el array, intercambiando entre array[ a ] y array[ b ], siendo a=rand(0,6) y b=rand(0,6) (2 diferentes rand), tantas veces como quieras mezclar o intercambiar.
Title: Re: ¿Un random funciona dentro de un for?
Post by: gukan on May 30, 2011, 06:32:32 PM
Quote from: SplinterGU on May 30, 2011, 04:33:37 PM
ese algoritmo no es para nada bueno, puedes perder un monton de tiempo en tener todos los elementos con numeros diferentes.

yo llenaria el array con numeros del 1 al 7 (para eso necesitas un array[6], ya que empieza de 0) y luego mezclo el array, intercambiando entre array[ a ] y array[ b ], siendo a=rand(0,6) y b=rand(0,6) (2 diferentes rand), tantas veces como quieras mezclar o intercambiar.
Cual no es bueno? el primero o el segundo?
El primero es lo que le decia, pero solo con 7 numeros no creo que se pierda demasiado tiempo haciendo rands extras.
El segundo es cierto que el array usado que creo en lugar de 7 tendria que ser de 6 (primero lo habia hecho pensando que queria 8 numeros) pero al final lo que te esta dando es que haras solo haras tantos rand comos numero quieres.
Title: Re: ¿Un random funciona dentro de un for?
Post by: SplinterGU on May 30, 2011, 07:04:37 PM
esta mal lo de repetir rands si salen duplicados, el problema es si te salen 1000 veces el numero 4 y nunca el numero 5, para dar un ejemplo.
Title: Re: ¿Un random funciona dentro de un for?
Post by: Futu-block on May 30, 2011, 07:59:32 PM
entonces necesitariamos un rand que omita los numeros ya usados
se puede crear una funcion...

<->

bueno ya he probado el while y vuelvo a lo mismo, son tan pocos numeros (del 0 al 7) que cuando se vuelve a hacer un random en una posicion del array inferior ha coincidido con uno posterior
Title: Re: ¿Un random funciona dentro de un for?
Post by: SplinterGU on May 30, 2011, 09:29:27 PM
eso no seria un rand.
Title: Re: ¿Un random funciona dentro de un for?
Post by: Drumpi on May 30, 2011, 10:46:54 PM
Splinter creo que metió etiquetas y gotos al código de Bennu. Si no te ves capaz de sacarlo al estilo C, puedes probar al estilo Basic.
Pero conseguir un array con todos los números aleatorios y distintos es bastante complicado, sobre todo si intentas hacerlo eficiente, de una sola pasada. No obstante, existe un algoritmo a nivel de bits capaz de obtener una secuencia pseudoaleatoria que pase por todos los números sin repetirse (tiene la pega de que la serie es la misma, pero puedes empezar desde distintos puntos de la misma), tiene que ver con desplazamientos de bits, máscara XOR y sumas, pero si necesitas que la secuencia sea distinta cada vez, entonces no te sirve.

Estadísticamente puedes usar rand con los 4 o 5 primeros números, repitiéndolo hasta obtener un número que no haya salido, con una tasa de coincidencias bastante baja, pero los últimos es posible que tardes en generarlos incluso décimas de segundo (a 100000 números por segundo, muy mala suerte tienes que tener para que, al generar sólo 7 números, se note en la ejecución).
Title: Re: ¿Un random funciona dentro de un for?
Post by: Futu-block on May 30, 2011, 10:52:48 PM
bueno, para lo que es lo he solucionado facil, con una serie correlativa:

Se trataba de poner en una rejilla de 8x8 a ocho items sin repetir ni una fila ni columna, cada numero del arrai correspondia a tales filas y columnas...

lo he solucionado provisionalmente poniendo correlativas las filas y un ramdon a las columnas; de modo que desde arriba hacia abajo me salgan los items en la columna que quiera, que para lo que es en cierta manera me la repamplinfa
>-<

aunque pensandolo bien, son tan pocos numeros que si coincide con el anterior puedo ponerle el 1, si ya hay uno usado ponerle el 2, si tambien está usado el 3...
creo que es buena idea