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
¿Inicializas la semilla? Yo normalmente lo hago con time.
si, por supuesto
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.
estas creando 7 procesos en realidad...
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
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)
pon la semilla justo despues del BEGIN de programa principal, cuando defines la resolucion y solo una vez.
¿Puedes poner el trocito de código de inicialización de la semilla?
[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??
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.
Bueno chicos. La cama me reclama. ¡Suerte Futu! :D
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
el error es muy facil de ver, seteas la semilla despues de usar el rand en los procesos que llamas antes del mismo xDD
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;
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.
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???
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
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++
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.
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.
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.
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
eso no seria un rand.
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).
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