Problemas al llamar a srand(time(NULL)) dentro de la función rollDice

4 minutos de lectura

Problemas al llamar a srandtimeNULL dentro de la funcion rollDice
Lyrk

Cuando usé al principio srand(time(NULL)) en rollDice() función no funcionó. Pero cuando lo pongo en main, funciona. ¿Porqué es eso? ¿Puedes decirme la lógica?

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

int rollDice(void) {
    return (1+rand()%6) + (1+rand()%6);
}
int main(void) {
    int roll;
    srand(time(NULL));          
    roll = rollDice();
    printf("You rolled %d.\n", roll);

    enum Gamestatus {WON,LOST,CONTINUE};
    enum Gamestatus status;

    while(status==CONTINUE){
        printf("You are rolling again: \n");
        printf("You rolled %d\n", roll = rollDice());

        if (targetPoint==roll){
            printf("You win!");
            status=WON;
        }
        else if(7==roll){
            printf("You lost!");
            status=LOST;
        }
        else
            status=CONTINUE;
    }
    return 0;
}

  • ¿A qué te refieres con “no funciona”?

    – ziu

    22 de marzo de 2013 a las 12:53

  • Su problema es uno que muchos, muchos las personas se encuentran cuando intentan usar interfaces de números aleatorios por primera vez, y se les ha preguntado una y otra vez en Stack Overflow (esa búsqueda no es todos los duplicados, pero casi la mitad de ellos lo son).

    – dmckee — gatito ex-moderador

    22 de marzo de 2013 a las 13:00

  • Cuando al principio puse srand dentro de rollDice, siempre devolvía 7 pero cuando lo puse debajo de main, me dio resultados diferentes a los esperados.

    – Lyrk

    22 de marzo de 2013 a las 13:12

  • ¿Cuántas tiradas antes de que el usuario comience a adivinar con precisión el resultado? 😉

    – autista

    22 de marzo de 2013 a las 13:25


Problemas al llamar a srandtimeNULL dentro de la funcion rollDice
pmg

Digamos que tienes millones de libros con filas y filas de números aleatorios. Antes de obtener un número aleatorio, debe seleccionar un libro.

Después de tener un libro, para obtener números aleatorios, lea los números secuencialmente del libro. Al cambiar el libro se obtiene otra secuencia de números aleatorios.
Cambiando al mismo libro reinicia la secuencia desde el primer número del libro.

srand() elige un libro y comienza números aleatorios desde el principio
rand() lee el siguiente número del libro seleccionado

Si pones srand() dentro del ciclo, está reiniciando efectivamente la secuencia de números aleatorios desde el comienzo del mismo libro.

Solución: seleccione 1 libro una vez y siga leyendo números de él para siempre jamás.

En un programa C, si no “selecciona un libro”, los números aleatorios provienen del libro #1 o, en otras palabras, en ausencia de un srand() llamada, la función rand() se comporta como si srand(1) ha sido llamado.

  • srand(time(NULL)) seleccionaría el libro n.º 1363958819 si se emitiera ahora mismo 🙂

    – pmg

    22 de marzo de 2013 a las 13:27

Problemas al llamar a srandtimeNULL dentro de la funcion rollDice
Liho

Cuando haces la siembra dentro del rollDice función y luego está llamando a esta función en un bucle, no solo porque está sembrando más a menudo de lo que debería, sino que el bucle es tan rápido que está sembrando con el mismo valor (al mismo tiempo) que produce en rand() devolviendo el mismo valor:

lossrand()La función establece su argumento como la semilla para una nueva secuencia de enteros pseudoaleatorios que devolverárand().Estas secuencias son repetibles llamandosrand()con el mismo valor de semilla.

Regla de oro: Sembrar solo una vez.

Vale la pena echar un vistazo a las preguntas anteriores que abordan este problema:
srand(time(NULL)) no cambia el valor inicial lo suficientemente rápido
Números siempre repetidos dados por rand()
La función srand está devolviendo los mismos valores, etc.

El problema es que la función srand() está generando el generador de números aleatorios y usted lo está generando con la hora actual, que tiene una resolución de 1 segundo. Entonces, cuando llamas a srand() desde dentro de la función rollDICE(), obtienes exactamente el mismo resultado de rand() en cada llamada que ocurre en el mismo segundo. Cuando el segundo marque, obtendrá un resultado diferente de rand().

Llamar a srand() dentro de main significa que solo lo llama una vez, antes de comenzar a rodar, y luego rand() le devolverá una secuencia de números aleatorios.

  • Pero si se ejecuta una vez cuando pongo main, ¿por qué da resultados diferentes? Creo que debido a que se llama uno en principal, tiene que dar lo mismo una y otra vez. Cuando lo pongo dentro de rollDice, debido a que rollDice se llama en diferentes momentos, tiene que dar números diferentes. Pero la situación no es así.???

    – Lyrk

    22 de marzo de 2013 a las 13:14

  • srand() “semillas” del generador de números aleatorios. es decir, establece la secuencia pseudoaleatoria de números que rand() le devolverá más tarde. Si siembra el generador de números aleatorios varias veces con el mismo número, siempre obtendrá el mismo resultado de rand(). Si llama a srand() dentro de rollDice() y pasa la hora actual, entonces “reinicia” el generador de números aleatorios con exactamente el mismo valor cada vez hasta que cambia la hora (la manecilla de segundos marca). Cuando llamas a srand() en main, solo siembras el generador una vez y cada llamada a rand() después de eso devuelve un nuevo resultado.

    – K Scott Piel

    22 de marzo de 2013 a las 13:18


  • muchas gracias por la explicacion

    – Lyrk

    22 de marzo de 2013 a las 13:20

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad