Números aleatorios en C

4 minutos de lectura

Numeros aleatorios en C
Serguéi Gavruk

for(i = 0; i < n; i++){
        srand(time(NULL));
        printf("%d ", time(NULL));
        for(j = 0; j < (n-1); j++){
            a[i][j] = rand();
        }
    }

Intento generar números aleatorios, pero son lo mismo… lo intento srand(i * time(NULL)). No importa.. ¿Qué debo hacer?

Declaración de matriz:

int** a;
int i;
printf("Enter array size: ");
scanf("%d", &n);

a = (int**)calloc(n, sizeof(int));
for(i = 0; i < n; i++)
    a[i] = (int*)calloc(n-1, sizeof(int));

  • Tu primero calloc la llamada debe ser sizeof(int *) pero parece que está trabajando en un host donde los punteros simples y los enteros tienen el mismo tamaño (eso es cierto en la mayoría de las arquitecturas).

    – mpez0

    16 de marzo de 2010 a las 0:33

  • Básicamente, editó su pregunta justo después de que se dieron las respuestas, de manera que estas respuestas ya no coincidan con la pregunta y se invalidaron de esta manera. Por favor, no lo hagas.

    – Aconcagua

    18 de octubre de 2018 a las 8:01

Numeros aleatorios en C
byron whitlock

Llamada srand() fuera del bucle. Lo estás volviendo a sembrar en cada iteración.

srand() siembra el generador de números aleatorios para que obtenga una secuencia diferente de números aleatorios dependiendo de la entrada. Su bucle se ejecuta muy rápido, por lo que la llamada a time(NULL) siempre devuelve el mismo valor. Está restableciendo la misma secuencia aleatoria con cada iteración. Como regla general, sólo llame srand() una vez en su programa.

  • De acuerdo, (generalmente) no debería necesitar sembrar un generador de números aleatorios más de una vez.

    – bta

    15 de marzo de 2010 a las 18:28

  • @bta: es cierto que no debería necesitar sembrar rand() mas de una vez. Volver a sembrar generadores de números aleatorios “adecuados”, con lo que me refiero a cualquier cosa utilizada por seguridad, es otra cuestión.

    –Steve Jessop

    15 de marzo de 2010 a las 18:37

no llames srand() cada vez que pase por el ciclo, solo hágalo una vez de antemano.

preguntas frecuentes 13.15 para 13.20 será de interés. Y estoy tentado de crear una nueva etiqueta para tales preguntas.

  • Tal vez cree una sola pregunta titulada “¿Cómo afecta srand() al estado del generador de números aleatorios?”, y márquela como un duplicado cada vez que surja otra variación sutil 😉

    –Steve Jessop

    15 de marzo de 2010 a las 18:39

  • Sí, una versión CW. Pero entonces estaríamos duplicando todos los comp.lang.*.faqs, ¿no?

    – dirkgently

    15 de marzo de 2010 a las 18:45

  • Sí, pero SO inevitablemente contendrá innumerables duplicados de preguntas frecuentes (por definición de F), por lo que duplicará comp.lang.*.faq hagas lo que hagas. Sin embargo, a menos que las preguntas se marquen despiadadamente como duplicadas, incluso cuando varían un poco el tema, terminarán con menos información que las preguntas frecuentes existentes (suponiendo que las preguntas frecuentes lo cubran bien). La versión CW de las preguntas frecuentes que también son F en SO podría etiquetarse como tal y vincularse a las preguntas frecuentes del idioma y cualquier otro recurso relevante, y podría formular la pregunta de la manera más general, para asegurarse de que atrapen a la mayoría de los engañados. O algo.

    –Steve Jessop

    15 de marzo de 2010 a las 20:12


  • Algo, yo también he estado pensando. ¿Mover esta discusión a meta?

    – dirkgently

    15 de marzo de 2010 a las 20:39

srand es una función que “sembra” el generador de números aleatorios. En caso de que no lo sepas, los números aleatorios en las computadoras no son realmente aleatorios. En efecto, la computadora solo tiene una lista de números que parecen aleatorios y usted usa srand para decirle dónde empezar en esa lista, con cada llamada a rand() devolviendo el siguiente elemento de la lista.

La razón por la que escribes srand(time(NULL)) es hacer que los números aleatorios comiencen en algún punto que no será el mismo cada vez que ejecute el programa (a menos que los programas comiencen al mismo tiempo).

Entonces, lo que está haciendo aquí es decirle repetidamente al programa que reinicie la lista de números aleatorios en el mismo punto (porque el tiempo es el mismo cada vez que pasa por el ciclo). Mover la llamada a srand fuera del bucle y obtendrá los resultados correctos.

texto alternativo

Numeros aleatorios en C
jonh

srand(time(NULL)); 

for(i = 0; i < n; i++){         
        printf("%d ", time(NULL)); 
        for(j = 0; j < (n-1); j++){ 
            a[i,j] = rand(); 
        } 
    } 

Llame a srand una vez fuera del bucle.

1647638593 370 Numeros aleatorios en C
pajtón

tienes que llamar srand() antes de entrar en el bucle. srand() inicializa el generador de números de radnom con la semilla dada y genera una secuencia única de números aleatorios para esta semilla.

Su bucle se ejecuta muy rápido, por lo que cada llamada a time(NULL) produce el mismo tiempo (medido en segundos); por lo tanto, inicializa el generador de números aleatorios con la misma semilla en cada iteración del ciclo.

¿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