Se puede combinar dos enteros aleatorios de 4 bytes para producir un 8 bytes uno:
#include <stdint.h>
...
uint64_t random =
(((uint64_t) rand() << 0) & 0x00000000FFFFFFFFull) |
(((uint64_t) rand() << 32) & 0xFFFFFFFF00000000ull);
Desde rand
vuelve int
, y sizeof(int) >= 4
en casi cualquier plataforma moderna, este código debería funcionar. Agregué el << 0
para hacer el intento más explícito.
El enmascaramiento con 0x00000000FFFFFFFF
y 0xFFFFFFFF00000000
es para evitar la superposición de los bits en los dos números en el caso sizeof(int) > 4
.
EDITAR
Desde @Banthar comentó que RAND_MAX
no es necesariamente 2^32
, y creo que se garantiza que sea al menos 2^16
, puede combinar cuatro números de 2 bytes sólo para estar seguro:
uint64_t random =
(((uint64_t) rand() << 0) & 0x000000000000FFFFull) |
(((uint64_t) rand() << 16) & 0x00000000FFFF0000ull) |
(((uint64_t) rand() << 32) & 0x0000FFFF00000000ull) |
(((uint64_t) rand() << 48) & 0xFFFF000000000000ull);
2^64 es mucho mayor que 999999999. –