Implementación Rand

Me gustaría ver cómo se implementan las funciones rand () y srand () y me gustaría modificar el código para modificarlo según mis requisitos. ¿Dónde puedo encontrar el código fuente de rand () y srand ()?

Toma una semilla como argumento de entrada, generalmente de la siguiente manera:

double result = srand(time(NULL)); 

y devuelve un número aleatorio que se adhiere a la probabilidad y, por lo tanto, al número esperado de ocurrencias.

de los foros de CodeGuru :

 void __cdecl srand (unsigned int seed) { #ifdef _MT _getptd()->_holdrand = (unsigned long)seed; #else /* _MT */ holdrand = (long)seed; #endif /* _MT */ } int __cdecl rand (void) { #ifdef _MT _ptiddata ptd = _getptd(); return( ((ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L) >> 16) & 0x7fff ); #else /* _MT */ return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff); #endif /* _MT */ } 

Espero que esto ayude.

rand y srand generalmente se implementan como un simple LCG , puede escribir fácilmente los suyos (son pocas líneas de código) sin buscar las fonts de rand y srand . Tenga en cuenta que, si necesita números aleatorios para fines “graves” (por ejemplo, criptografía), hay RNG mucho mejores que LCG.

Por cierto, el estándar C en sí mismo incluye una implementación de muestra de rand y srand :

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

El glibc (usado por gcc) es la fórmula simple:

 x = 1103515245 * x + 12345 

envolviendo alrededor de 2 32 , como se muestra aquí . Puedes simplemente establecer x como la semilla y seguir llamando a una función para evaluar esa expresión (y actualizar la semilla).

Pero debe tener en cuenta que los generadores congruenciales lineales como este se consideran adecuados pero no ideales.

Si bien el único generador ideal de números aleatorios sería perfectamente aleatorio, el Mersenne Twister probablemente se acerque.