Foros del Web » Programación para mayores de 30 ;) » C/C++ »

no se generan bien numeros aleatorios

Estas en el tema de no se generan bien numeros aleatorios en el foro de C/C++ en Foros del Web. Hola a todos, He hecho una función en C que desordena elementos del array intercanbiando valores en posiciones aleatorias, para ello. Código: void desordena_baraja(int *puntero){ ...
  #1 (permalink)  
Antiguo 21/08/2009, 10:13
Avatar de neandertal  
Fecha de Ingreso: enero-2008
Ubicación: Barcelona
Mensajes: 79
Antigüedad: 16 años, 9 meses
Puntos: 1
Pregunta no se generan bien numeros aleatorios

Hola a todos,

He hecho una función en C que desordena elementos del array intercanbiando valores en posiciones aleatorias, para ello.

Código:
void desordena_baraja(int *puntero){

    int i,temp,random,random2;
    srand(time(NULL));

    //Se desordena el array
    for (i=0; i<200; i++){
        random=rand() % 52 + 1;
        random2=rand() % 52 + 1;
        temp = puntero[random];
        puntero[random] = puntero[random2];
        puntero[random2] = temp;
    }
}
El puntero apunta a un array de longitud 52 que contiene valores ordenados del 0 al 51.

El problema que tengo es que tras pasar esta función en algunas ocasiones me aparece en el array un valor 2009091650 que no deberia estar ahi, y aparece por alguna razón, ya que he comprobado los valores del array antes de llamar a la función y son correctos.
  #2 (permalink)  
Antiguo 24/08/2009, 01:55
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Respuesta: no se generan bien numeros aleatorios

Si rand devuelve 51 (51 % 52 = 51) al sumarle uno random (o random2) sera 52 y por lo tanto estara leyendo mas alla de los limites del array (el + 1 es un error y con el tampoco sera nunca 0 el resultado, con lo cual ignoraras siempre al primer elemento).
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO

Última edición por Eternal Idol; 24/08/2009 a las 02:03
  #3 (permalink)  
Antiguo 25/08/2009, 06:08
 
Fecha de Ingreso: agosto-2009
Mensajes: 18
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: no se generan bien numeros aleatorios

Excelente respuesta amigo!!
Le diste en el ojO!!
  #4 (permalink)  
Antiguo 25/08/2009, 06:31
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Respuesta: no se generan bien numeros aleatorios

Gracias; igual el objetivo era unicamente ayudar a resolver el problema.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 30/08/2009, 19:16
Avatar de neandertal  
Fecha de Ingreso: enero-2008
Ubicación: Barcelona
Mensajes: 79
Antigüedad: 16 años, 9 meses
Puntos: 1
Exclamación Respuesta: no se generan bien numeros aleatorios

Gracias por la corrección, además me ha servido para darme cuenta de que el error esta en otra parte del código ( o eso creo ), posteare el código entero a ver si me pueden ayudar.
Código:
int main(){

    int i;
    int baraja[52];

    //Inicializo los arrays
    for (i=0; i<52; i++)baraja[i]=i;

    pinta_array(baraja);
    desordena_baraja(baraja);
    printf("Baraja de cartas desordenada: \n");
    pinta_array(baraja);
    //pinta_cartas(baraja);
    getchar();
    return 0;
}

void desordena_baraja(int *puntero){

    int i,temp,random,random2;
    srand(time(NULL));

    //Se desordena el array
    for (i=0; i<200; i++){
        random=rand() % 52;
        random2=rand() % 52;
        temp = puntero[random];
        puntero[random] = puntero[random2];
        puntero[random2] = temp;
    }
}
Las funciones pinta_array() Muestra los valores de un array
y pinta_cartas() no son importantes ya que solo muestran caracteres en pantalla.

El programa devuelve ( valores antes de desordenar ):

0-1-2-3-4...51-4201408

El problema deberia estar aqui ya que esta linea asigna los valores iniciales al array:
Código:
for (i=0; i<52; i++)baraja[i]=i;
me pregunto de donde saldrá ese 4201408
  #6 (permalink)  
Antiguo 31/08/2009, 00:11
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Respuesta: no se generan bien numeros aleatorios

No, esa inicializacion es correcta, el bucle se ejecuta desde 0 a 51 (< 52).
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 31/08/2009, 01:52
 
Fecha de Ingreso: agosto-2009
Mensajes: 67
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: no se generan bien numeros aleatorios

Hola...

Perdona la pregunta, pero si realmente te está escribiendo lo que nos dijiste:

0-1-2- ... -51-4201408

Tienes que darte cuenta de que ya te ha escrito toda la baraja (del 0 al 51). ¿Sería posible que te estuvieras pasando de vueltas en el bucle que pinta?


Un saludo.
  #8 (permalink)  
Antiguo 31/08/2009, 02:02
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Respuesta: no se generan bien numeros aleatorios

Si, tal como dice tistklehoff, el problema esta al mostrar en pantalla, estas accediendo a un elemento que no es parte del array (son 52, de 0 a 51) y por lo tanto su valor es irrelevante.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #9 (permalink)  
Antiguo 31/08/2009, 05:26
Avatar de neandertal  
Fecha de Ingreso: enero-2008
Ubicación: Barcelona
Mensajes: 79
Antigüedad: 16 años, 9 meses
Puntos: 1
Respuesta: no se generan bien numeros aleatorios

Encontré el error, aunque no acabo de comprenderlo del todo.
Código:
void pinta_array(int *posicion){
    int i;
    for(i=0; i<51; i++)printf("%d-",posicion[i]);
    printf("%d\n",posicion[i+1]);
}
Cuando sale del for i no deberia ser igual a 50 ? y luego en la última línea pintar el posicion[51] ?
  #10 (permalink)  
Antiguo 31/08/2009, 05:43
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Respuesta: no se generan bien numeros aleatorios

No, i al salir es 51. En la ultima ejecucion del bloque, i es 50, se incrementa el contador y entonces ya no vuelve a entrar al bucle debido a que justamente i ya no es menor a 51, sino que es igual. Otra vez el + 1 es el problema.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #11 (permalink)  
Antiguo 31/08/2009, 05:55
Avatar de neandertal  
Fecha de Ingreso: enero-2008
Ubicación: Barcelona
Mensajes: 79
Antigüedad: 16 años, 9 meses
Puntos: 1
De acuerdo Respuesta: no se generan bien numeros aleatorios

Ahora ya me ha quedado mucho mas claro

Muchas gracias por la ayuda
  #12 (permalink)  
Antiguo 31/08/2009, 05:58
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Respuesta: no se generan bien numeros aleatorios

De nadas
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:56.