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
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.
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;
}
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.
s/adequate/mediocre /, diría yo. –
- 1. gcc implementation of rand()
- 2. PHP - ¿Es rand (1,1000) = 1000 tan probable como rand (1,1000) = rand (1,1000)?
- 3. Agrupar por valor RAND()
- 4. ORDER BY RAND() alternativa
- 5. reemplazar rand() con openssl_random_pseudo_bytes()
- 6. SQLite - ORDER BY RAND()
- 7. ORDER BY RAND no funciona
- 8. rand cambia de valor sin cambiar semilla
- 9. ¿Qué algoritmos comunes se usan para el rand de C()?
- 10. Ruby rand() no puede aceptar variables?
- 11. usando rand para generar un número aleatorio
- 12. ¿Rand() depende del tiempo en php?
- 13. Rand() no es tan aleatorio en Perl
- 14. PHP rand() ... obtener verdaderos 50/50 resultados?
- 15. ¿Por qué se usa 1103515245 en rand?
- 16. Dificultad con el paquete Go Rand
- 17. MySQL: Alternativas a ORDER BY RAND()
- 18. C: la verdad definitiva sobre rand, random y arc4random
- 19. ¿Cómo puedo generar números aleatorios sin la función rand()?
- 20. RAND no diferente para cada fila de ACTUALIZACIÓN T-SQL
- 21. rand() que generan al mismo número de compilación
- 22. Entender el algoritmo de la función rand() de Visual C++
- 23. ¿El rand de stdlib() siempre da la misma secuencia?
- 24. ¿Cómo seleccionar ORDER BY columna y RAND() ambos?
- 25. Creación de funciones no deterministas en SQL Server utilizando RAND()
- 26. ¿Cómo siembro la función rand() en Objective-C?
- 27. ¡Optimizando mi declaración de mysql! - RAND() DEMASIADO LENTO
- 28. diferentes resultados de rand() en Windows y Linux
- 29. ¿Por qué rand() no es tan aleatorio después del tenedor?
- 30. Magento conseguir productos de la categoría, por orden de rand()
Gracias u ... pero ¿qué es _MT ?? – nikhil
De acuerdo con este código 'holdrand' crecería rápidamente y pronto causaría un desbordamiento. 'holdrand = holdrand * 214013L + 2531011L' – orlp
Acerca de' double result = srand (time (NULL)); ': ¿por qué tienes ese' doble resultado '? 'srand' no tiene un valor de retorno ... –