En C/C++, normalmente usamos rand()
y srand()
cuando queremos obtener un entero aleatorio. Pero cuando intenté reescribirlo, me resultó difícil entender el algoritmo. La función se escribe muy fácilmente en solo unas pocas líneas, pero la fórmula es errónea.Entender el algoritmo de la función rand() de Visual C++
La fórmula principal:
ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L;
El código original involucrados:
void __cdecl srand (unsigned int seed)
{
_getptd()->_holdrand = (unsigned long)seed;
}
int __cdecl rand (void)
{
_ptiddata ptd = _getptd();
return (((ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
}
hmm, no sé, la función ya está ahí ... ¿Por qué intentar volver a implementarla? –
@Rocky, no hay nada de malo en tratar de entender los fundamentos del código que damos por sentado. De hecho, debe ser alentado. –
@Rocky: ¡De hecho! Nunca dé algo por hecho si al menos no tiene la posibilidad de tener la esperanza de poder explicar el principio. Qi Guo: si estás cansado del LCG, echa un vistazo al Mersenne Twister, un PRNG popular, rápido y de alta calidad. –