Duda con algoritmo para desordenar Array

Started by sanson222, March 28, 2012, 02:59:24 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

sanson222

Hola otra vez, tengo un problema con este metodo para desordenar los valores de un array:


teniendo los valores ya asignados en el siguiente array: jugador.mazo[40]
deck_card es la cantidad de valores que hay en el array



for(a=0;a<200;a++)
ran1=rand(0,deck_card);
mem1=jugador.mazo[ran1];
ran2=rand(0,deck_card);
jugador.mazo[ran1]=jugador.mazo[ran2];
jugador.mazo[ran2]=mem1;
end


seria imposible que me salgan los 3 primeros valores siempre iguales no? pues me salen iguales y no tengo la menor idea de que es, puede que sea simple y no me doy cuenta pero nose que es.


probe cambiar el valor de 200 a 20000 y aun asi sigue igual, creo que tube un problema parecido una vez pero con Fenix y recurri a ustedes aquella vez

gecko

Antes de usar la funcion rand() proba hacer rand_seed( time() ) para darle una semilla distinta al generador de numeros aleatorios.
Torres Baldi Studio
http://torresbaldi.com

Erkosone

Hola, yo me monté algo para desordenar una estructura, quizá te sirva de algo mirar el código, es muy sencillo.
http://forum.bennugd.org/index.php?topic=3016.msg52126#msg52126

sanson222

#3
no me funciono, peo creo que descubri la razon:


Si invocamos la funcion rand() esta no genera un numero aleatorio en base a la hora? es decir que si hago que la funcion se repita 1000 veces en menos de un segundo donde no cambia el tiempo siempre me dara el mismo valor no? creo que esa es la razon. >_> puede ser? es decir la invoco 1000 veces a la funcion antes de un FRAME


EDIT: bueno pude resolver pero es un abuso de frames, ya que la funcion rand() regresa un numero diferente despues de un frame; no antes, asi que no importa cuantas veces uses la funcion rand() antes de hacer un frame ya que va a devolver siempre el mismo numero


el codigo que use:
const
CARTAS=10;


end


global
int ran1,mem1,ran2,a,b;
indice=0;
mazo[CARTAS];
end


begin


LOAD("PRUEBA1",mazo);
for(a=0;a<200;a++)
for(b=0;b<CARTAS;b++)
rand_seed(time());
ran1=rand(0,CARTAS); while(ran1==indice) ran1=rand(0,CARTAS); frame; end
mem1=mazo[indice];
mazo[indice]=mazo[ran1];
mazo[ran1]=mem1;
indice++;
end
indice=0;
end
say(mazo[0]);
say(mazo[1]);
say(mazo[2]);
say(mazo[3]);
frame;
end

gecko

perdon, lo explique mal.

el rand_seed ( time() ) lo tendrias que poner al principio de tu programa, digamos despues del begin. Con eso haces que cada vez que se inicie el programa genere numeros distintos. Supongo que con eso se tendria que solucionar.

Despues no importa cuando (o cuantas veces) llames a la funcion rand(), deberia dar siempre una secuencia distinta de numeros.
Torres Baldi Studio
http://torresbaldi.com

SplinterGU

sanson222, imposible, rand no depende del tiempo... a menos que junto al rand tengas un rand_seed(time())... solo en ese caso daria el mismo dentro del mismo segundo.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

sanson222

#6
JAJA me olvide de sacar el rand_seed(time()); perdon XD la proxima voy a ser mas cuidados


EDIT: aun si saco el rand_seed() el rand me los acomoda siempre de la misma manera, pero con el rand_seed(time()) se me soluciona el problema, no entendi muy bien que hize o que paso ya que me confundi pero se que si lo hago con rand_seed(time())  poniendolo al principio del programa funciona y con eso basta para mi

begin
   loop
     gracias();
   frame;
   end
end



Bien arreglando el codigo me a quedado asi :


for(a=0;a<1000;a++)
for(s=0;s<deck_card+1;s++)
//rand_seed(time());
ran1=rand(0,deck_card); while(ran1==indice) ran1=rand(0,deck_card); say("REPETIDO "+ran1);  end
mem1=jugador.mazo[indice];
jugador.mazo[indice]=jugador.mazo[ran1];
jugador.mazo[ran1]=mem1;
indice++;
//say(jugador.mazo[indice]);
end
indice=0;
end

SplinterGU

no entiendo que es lo que no entiendes...

rand() retorna numeros al azar que salen de calculos a partir de una semilla, siempre que arranca un programa la semilla es la misma y por ende la secuencia de valores que retorna es la misma, si lo que pretendemos es tener secuencias de valores diferentes entonces necesitamos cambiar dicha semilla inicial, para cambiar la semilla usamos rand_seed... si ponemos siempre el mismo valor en rand_seed, siempre obtendremos la misma secuencia de valores, para evitar esto usamos otra funcion... time(), que nos da el tiempo en segundos desde el 1/1/1970.

entonces, el rand_seed con time() deberia ser llamado en intervalos no menores a 1 segundo (ya que 1 segundo es la granularidad de time()), o llamarlo 1 sola vez al arrancar el programa... con esto inicializamos la semilla con un valor "aleatoreo" (o mejor dicho, diferente en el tiempo, con una granularidad de 1 segundo) y ya seria mas que suficiente para lograr que nuestro codigo se ejecute dando RANDs (normalmente) diferentes en distintas ejecuciones.

no se si ahora con esto te queda mas claro, pero como no entendi que no entendias, intente explicar todo el asunto.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

sanson222

Mas claro no puede estar, gracias por aclarme la duda :D