¿Un random funciona dentro de un for?

Started by Futu-block, May 29, 2011, 08:16:56 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

SplinterGU

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

Futu-block

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???

gukan

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

Futu-block

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++

SplinterGU

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

gukan

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.

SplinterGU

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

Futu-block

#22
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

SplinterGU

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

Drumpi

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).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Futu-block

#25
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