generación de números aleatorios

Hola:

para mi aplicación necesito generar en varios momentos una serie de valores aleatorios. lo hago con la función PA_RandMax(), me genera secuencias aleatorias sí, pero el problema es que me genera siempre la misma secuencia, es decir, que si en una ejecución inicial me saca: 8,3,6,5, en la siguiente me saca: 8,3,6,5. Estuve mirando y vi que en el API de Palib, habia una función a la que se llamaba antes de empezar la ejecución del programa: PA_InitRand(), se supone que inicializa una nueva semilla por cada ejecución lo que hace que la secuencia anterior siempre sea diferente. Pues ni llamando a esta función me va bien, siempre me genera la misma secuencia. A parte de esto he probado también a hacer lo mismo con las funciones de aleatorios propias de C srand() y rand() y cuando le paso a srand() la hora del sistema o el pid del proceso para que en cada ejecución varie la semilla, tampoco funciona. He comprobado con printf que valores tienen tanto la hora del sistema como el pid y para todas las ejecuciones me sale para el primero: "thu Jan 1 00:00:06 1970" y para el segundo "-1", no varian en ningún momento. Todo esto lo intento ejecutar desde el emulador.

Gracias, un saludo.
También me interesa, no lo he conseguido hacer...
Multiplicando el valor supuestamente aleatorio por, por ejemplo, los segundos, debería, no es así?
Sí, en principio debería valer cualquier valor que sea diferente en cada ejecución del programa para lo de la semilla, pero no hay manera...
(mensaje borrado)
¿que emulador estas usando? pruebalo en una consola que sera mas fiable que cualquier emulador que por cualquier motivo sea incompatible con esa funcion (a mi con el NO$GBA no me ha pasado, pero me suena que a alguien le paso algo asi con los numeros aleatorios en un emulador)

o si no tienes una consola para probar pasanos el archivo compilado para ver si tenemos el mismo resultado siempre o no
#include <time.h>
#include <stdlib.h>

...

srand(time(NULL));

...

int etc = rand();


Si no te va, seguramente sea porque la comunicación entre ARM9 y ARM7 falla (por lo menos la parte de libnds) y no llega la fecha correctamente al ARM9. Motivos que se me ocurren:
-Usas versiones de PAlib y libnds que no se llevan bien entre sí (o libnds y devkitarm, o...).
-Usas emuladores que no soportan el RTC. Prueba en la DS para descartar este problema.

En resumen, actualiza devkitpro y prueba en la DS.
Ahora si puedo escribir, habia eliminado mi mensaje anterior y tenia que esperar a que alguien contestara.

Otra forma de que rand te genere numeros aleatorios cada vez que lo llames, es creando una funcion utilizando a esta misma, y dejando a srand a comienzos del main, me explico:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int aleatorio ( void );


int main()
{
int i = 0, i2 = 0;
srand( time ( NULL ));
while ( i < 10 )
{
i++;

while ( i2 < 10 )
{
printf("%d\n", aleatorio());
i2++;
}

i2 = 0;
puts("");
}

return 0;
}

int aleatorio ( void )
{
int i = 0, i2 = 0;

return rand()%10+1;
}


Intentalo, y veras que cada vez que es llamada la funcion aleatorio(); genera numeros diferentes que no se repiten ;)
Pruebalo en la DS directamente.

A mi todo lo relacionado con el tiempo no me funciona en emuladores usando windows 7. Por ejemplo, una cuenta atrás de varios segundos se queda congelada en el emulador (NO$GBA y desmume) y en la DS va todo bien.
keda escribió:Pruebalo en la DS directamente.

A mi todo lo relacionado con el tiempo no me funciona en emuladores usando windows 7. Por ejemplo, una cuenta atrás de varios segundos se queda congelada en el emulador (NO$GBA y desmume) y en la DS va todo bien.

En el NO$GBA lo que pasa es que no está emulada la IRQ del RTC, si no recuerdo mal, y es la que usa libnds para actualizar la hora. La hora que leas en cualquier momento de la ejecución será la que había al arrancar el juego, que es cuando libnds lee la hora manualmente. Desmume ni idea.

La verdad es que ahora mismo yo me fiaría mas del Desmume que del NO$GBA, ha mejorado muchísimo y hasta emula cosas de 3D que el NO$GBA no. En cuanto a velocidad está claro que gana el NO$GBA, eso si.
bueno yo uso el DesMume, aún me queda por probar en una DS, lo que pasa que ahora no tengo una a mano, en cuanto consiga una hago la prueba y os comento. De todas maneras las librerías de arm que tengo yo creo que son bastante antiguas, cuando me instalé el entorno hace unos meses, el tutorial que utilizé decía que había que utilizar la arm específica que tengo yo y por eso lo hice.

Con el código que me ha puesto kenshin_spirit, me pasa lo mismo, realmente no entiendo muy bien el trozo de código, pero parece que hace un srand() y un rand() normal, la única diferencia es que se le llama a través de una función.

Ya os comentaré novedades.
yo_tu_el escribió:bueno yo uso el DesMume, aún me queda por probar en una DS, lo que pasa que ahora no tengo una a mano, en cuanto consiga una hago la prueba y os comento. De todas maneras las librerías de arm que tengo yo creo que son bastante antiguas, cuando me instalé el entorno hace unos meses, el tutorial que utilizé decía que había que utilizar la arm específica que tengo yo y por eso lo hice.

Con el código que me ha puesto kenshin_spirit, me pasa lo mismo, realmente no entiendo muy bien el trozo de código, pero parece que hace un srand() y un rand() normal, la única diferencia es que se le llama a través de una función.

Ya os comentaré novedades.


Por lo que pude entender en tu problema, es que al utilizar rand(); para generar numeros aleatorios a traves de la semilla lanzada por srand(); es que se repiten, o sea, en un ciclo te lanzara diferentes numeros, pero en el siguiente ciclo saldran los mismos numeros, y asi sucesivamente, cierto?

Siendo el caso anterior, olvida el codigo que te puse anteriormente, entendi algo diferente que no tiene nada que ver man, sin embargo este pequeño codigo, al menos lo acabo de comprobar, genera numeros aleatorios diferentes en cada iteracion del ciclo, genera numeros que van del 1 al 10.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
int i = 0, i2 = 0;
srand( time(NULL));

while ( i2 < 10 )
{
while( i < 10 )
{
printf("\n%d", rand()%10+1);
i++;
}
i = 0;
i2 ++;
puts("");
}

return 0;
}


Si no es lo que buscas, explicalo mejor, que tengo ganas de echarte una mano, o ayudarte a resolver el problema.
yo_tu_el escribió:bueno yo uso el DesMume, aún me queda por probar en una DS, lo que pasa que ahora no tengo una a mano, en cuanto consiga una hago la prueba y os comento. De todas maneras las librerías de arm que tengo yo creo que son bastante antiguas, cuando me instalé el entorno hace unos meses, el tutorial que utilizé decía que había que utilizar la arm específica que tengo yo y por eso lo hice.

Con el código que me ha puesto kenshin_spirit, me pasa lo mismo, realmente no entiendo muy bien el trozo de código, pero parece que hace un srand() y un rand() normal, la única diferencia es que se le llama a través de una función.

Ya os comentaré novedades.

Quieres una secuencia de números aleatorios diferente cada vez que inicias el programa. Para eso hace falta tener una semilla diferente cada vez, que es el tiempo. Si el emulador no emula correctamente el RTC, no tienes la hora, asi que no tienes semilla.

Prueba en NO$GBA.
11 respuestas