2011-01-22 18 views
11

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

Respuesta

9

Se necesita una semilla como en el argumento de entrada, por lo general como sigue: -

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 CodeGuru forums: -

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.

+0

Gracias u ... pero ¿qué es _MT ?? – nikhil

+0

De acuerdo con este código 'holdrand' crecería rápidamente y pronto causaría un desbordamiento. 'holdrand = holdrand * 214013L + 2531011L' – orlp

+1

Acerca de' double result = srand (time (NULL)); ': ¿por qué tienes ese' doble resultado '? 'srand' no tiene un valor de retorno ... –

20

rand y srand se implementan normalmente como un simple LCG, puede escribir fácilmente su propia (que es pocas líneas de código), sin buscar las fuentes 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 de C en sí incluye una implementación de ejemplo 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; 
} 
4

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

x = 1103515245 * x + 12345 

envoltura alrededor de al 2 , como se muestra here. Puede 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 acerca más.

+0

s/adequate/mediocre /, diría yo. –

Cuestiones relacionadas