Me gustaría generar un número aleatorio o cadena utilizando el preprocesador C ... um ... Ni siquiera sé si esto es posible, pero estoy tratando de cree variables sobre la marcha (las cadenas serían útiles aquí) y asígneles valores (enteros). Así que hay algunas cosas que trato de hacer, pero la pregunta básica sigue siendo: ¿puedo crear una cadena o número aleatorio con el preprocesador?Generar un número aleatorio con el preprocesador C
Respuesta
Respondo su pregunta de que desea tener una forma de crear tokens de identificador únicos a través del preprocesador.
gcc tiene una extensión que se llama __COUNTER__
y hace lo que espera de su nombre. Puede combinar esto con macro concatenación ##
para obtener identificadores únicos.
Si tiene un compilador C99, puede usar P99. Tiene macros llamadas P99_LINEID
y P99_FILEID
. Se pueden usar como
#include "p99_id.h"
P99_LINEID(some, other, tokens, to, make, it, unique, on, the, line)
y similar para P99_FILEID
.
El primero cambia el nombre de sus tokens y el número de línea y un hash que depende del número de veces que se ha incluido el archivo "p99_id.h". La segunda macro solo usa ese hash y no el número de línea, de modo que un nombre sea reproducible en varios lugares dentro de la misma unidad de compilación.
Estas dos macros también tienen contrapartes P99_LINENO
y P99_FILENO
que solo producen números grandes en lugar de tokens de identificador.
No hagas esto en C. Acabarás confundiendo a las personas. Si necesita crear variables sobre la marcha, use malloc
y realloc
y mantenga una matriz de sus valores.
Para responder a su pregunta, no. El preprocesador no incluye un generador de números aleatorios. Puede generar números aleatorios en tiempo de ejecución (con rand()
), pero si realmente los necesita en tiempo de compilación, tendrá que escribir su propio preprocesador y ejecutar su código a través de él. O simplemente podría usar 4, que fue determinado al azar por un rollo de un dado justo de 100 caras.
Basado en 1999-01-15 Jeff Stout (gracias a @ rlb.usa)
#define UL unsigned long
#define znew ((z=36969*(z&65535)+(z>>16))<<16)
#define wnew ((w=18000*(w&65535)+(w>>16))&65535)
#define MWC (znew+wnew)
#define SHR3 (jsr=(jsr=(jsr=jsr^(jsr<<17))^(jsr>>13))^(jsr<<5))
#define CONG (jcong=69069*jcong+1234567)
#define KISS ((MWC^CONG)+SHR3)
/* Global static variables:
(the seed changes on every minute) */
static UL z=362436069*(int)__TIMESTAMP__, w=521288629*(int)__TIMESTAMP__, \
jsr=123456789*(int)__TIMESTAMP__, jcong=380116160*(int)__TIMESTAMP__;
int main(int argc, _TCHAR* argv[]){
cout<<KISS<<endl;
cout<<KISS<<endl;
cout<<KISS<<endl;
}
Salida:
247524236
3009541994
1129205949
Muy buena implementación para un sistema integrado. Ambas respuestas son buenas. – Xofo
- 1. generar un número aleatorio con 7 dígitos
- 2. ¿Generar un número aleatorio dentro del rango?
- 3. Algoritmo para generar un número aleatorio
- 4. Generar número aleatorio entre dos números con una rara número
- 5. usando rand para generar un número aleatorio
- 6. Generar un número aleatorio de N-dígitos
- 7. Java Generar número aleatorio {-1,0,1}
- 8. ¿Cómo generar un número aleatorio en Bash?
- 9. generar un número aleatorio corto en java?
- 10. generando un número aleatorio con una distribución específica en c
- 11. Cómo generar un número aleatorio de cinco dígitos de Java
- 12. Número aleatorio en un bucle
- 13. Generar y repetir el número en C#
- 14. ¿Generar un número aleatorio dentro del rango en iOS?
- 15. cómo generar un número aleatorio de 0.5 a 1.0
- 16. ¿Cómo generar un número aleatorio "grande" en Python?
- 17. Generando un número aleatorio excluyendo el rango
- 18. Número aleatorio no repetitivo
- 19. ¿Cómo se genera un número aleatorio en C#?
- 20. generar un archivo aleatorio utilizando el script de shell
- 21. Java Generar número aleatorio entre dos valores dados
- 22. ¿Cómo puedo generar un número aleatorio utilizando la biblioteca estándar de C++ 11?
- 23. Número aleatorio CUDA que genera
- 24. cambiar probabilidad de obtener un número aleatorio
- 25. Produce un número aleatorio en un rango usando C#
- 26. La mejor forma de generar un flotante aleatorio en C#
- 27. Generar un entero aleatorio en un rango en Haskell
- 28. Ruby, generar un color hexadecimal aleatorio
- 29. ¿Cómo generar un número aleatorio con 8 dígitos en total en C#? (4 enteros, 4 parte fraccionaria)
- 30. RNGCryptoServiceProvider - Revisión de número aleatorio
En resumen: no. Tendrá que escribir un preprocesador simple propio. No te olvides de diseñar una manera de probar tu código fuente aleatorio. –
¿Has visto esto? http://www.ciphersbyritter.com/NEWS4/RANDC.HTM '1999-01-15 Jeff Stout' –
¿Realmente necesita * al azar * o simplemente necesita * único *? Si este último, entonces tal vez use '__LINE__' para crear nombres únicos de variables? –