suma repetir rango randomize rand numeros libreria generar funcion dev arreglo aleatorios c random srand

repetir - randomize en c



¿Cómo se relaciona srand con la función rand? (4)

Entiendo que la función rand () genera el mismo número (s) que cada uno que ejecuta si no cambia el número de inicialización. Ahí es donde entra srand (). El tiempo siempre está cambiando, así que sé que debes pasar el parámetro time (null) a srand. Mi pregunta es con el código de abajo de un sitio tutorial.

int main() { int i, n=5; time_t t; /* Intializes random number generator */ srand((unsigned) time(&t)); /* Print 5 random numbers from 0 to 50 */ for( i = 0 ; i < n ; i++ ) { printf("%d/n", rand() % 50); } return(0); }

No veo ningún enlace desde el srand.

((unsigned) time(&t));

y rand.

printf("%d/n", rand() % 50);

¿Dónde está la conexión entre rand y srand? Lo que quiero decir o esperar es que asumo que rand () obtendrá algún parámetro de srand (), por lo que sabe generar números diferentes cada vez. Supongo que se vería algo así como rand (srand (time (null));

Es como inicializar una variable sin usarla para mí. srand se está inicializando, pero no veo que se esté utilizando.

¿Rand genera números diferentes porque srand se llama primero antes que rand?


El número aleatorio de semillas es una variable estática global. rand y srand ambos tienen acceso a él.


No ve un enlace porque (afortunadamente!) El que diseñó rand() decidió mantener eso como un detalle de implementación, de la misma manera que no ve lo que hay dentro de un FILE de stdio; el inconveniente es que decidieron convertir ese estado en una variable global (pero oculta) en lugar de un parámetro para el generador.

Contrasta esto con el rand_r() desuso: el estado es un entero sin signo (se supone que es> = 32 bits), lo que significa que incluso está prohibido usar un generador mejor cuyo estado sea mayor que eso, simplemente porque no hay espacio para ¡Guárdalo!

Al mantener el estado interno oculto, en cambio, uno es libre de elegir cualquier algoritmo que funcione mejor (velocidad, período, ...) y usarlo entre bambalinas, siempre y cuando garantice que llamar a rand sin inicialización es lo mismo que llamar a srand con semilla == 1.

Paxdiablo te mostró el ejemplo del estándar C; vea, por ejemplo, http://en.wikipedia.org/wiki/Multiply-with-carry para ver un ejemplo utilizando un generador diferente que podría ocultar detrás de rand / srand.

Para ser extra claro adicional: si rand_r hubiera diseñado correctamente, habría un tipo opaco, digamos rand_t (que podría ser un número entero, una estructura, una matriz, ...), que pasaría a rand_r y a algunos srand_r srand_r , como en

rand_t state; srand_r(&state, 1); n = rand_r(&state);

La función rand es exactamente como esta, excepto que solo hay una variable de state .


srand() establece la semilla que usa rand para generar números "aleatorios" (entre comillas porque generalmente son pseudoaleatorios). Si no llama a srand antes de su primera llamada a rand , es como si hubiera llamado a srand(1) para establecer la semilla en uno.

Una gran cantidad de código utiliza la hora actual como semilla para que cada ejecución del programa use una secuencia diferente de números aleatorios, pero siempre se puede cambiar a algo como srand(42) durante la depuración, con el propósito de repetibilidad. Y la llamada a time() realidad no necesita una variable para ubicar la hora, solo puedes pasar NULL:

srand (time (NULL));

Todo se podría implementar en un solo archivo con algo como lo siguiente, el ejemplo dado en la norma ( ISO C99 7.20.2.2 The srand function ).

// RAND_MAX assumed to be 32767. static unsigned long int next = 1; void srand(unsigned int seed) { next = seed; } int rand(void) { next = next * 1103515245 + 12345; return (unsigned int)(next/65536) % 32768; }

El hecho de que la next es una variable estática en la parte superior del archivo significa que es invisible para todo lo que está fuera del archivo, pero visible para todo lo que está dentro (una especie de global localizado). Ese es el método de comunicación entre srand() y rand() .


rand te da una secuencia pseudoaleatoria de números.

Este número es generado por un algoritmo que devuelve una secuencia de números aparentemente no relacionados cada vez que se llama. Este algoritmo usa una semilla para generar la serie, que debe inicializarse a algún valor distintivo utilizando la función srand.

srand en cada llamada establece el puntero en algún lugar de la lista en la que está ingresando. Si no lo llama en cada intento o le asigna una semilla fija, le dará la misma secuencia. Muchos sugieren dar el segundo actual como semilla. Pero si intenta ejecutar su código dos veces en el mismo segundo, le dará la misma secuencia.

Para cada valor semilla diferente utilizado en una llamada a srand, se puede esperar que el generador de números pseudoaleatorios genere una sucesión diferente de resultados en las llamadas subsiguientes a rand para una explicación más detallada