#include #include #include #include #include #include #include #include "random.h" #define RAND_BUF_SIZE 1024 #define RND_DEV "/dev/urandom" unsigned int get_random(void) { static int rndbuf[RAND_BUF_SIZE]; static int index = RAND_BUF_SIZE; int fd, error, i = 0, ret; if (index < RAND_BUF_SIZE) return rndbuf[index++]; fd = open(RND_DEV, O_RDONLY); if (fd < 0) { error = errno; fprintf(stderr, "Error opening file %s: %s\n", RND_DEV, strerror(error)); ret = error; goto err; } do { ret = read(fd, rndbuf + i, RAND_BUF_SIZE * (sizeof(rndbuf[0]) - i)); if (ret <= 0) { error = errno; fprintf(stderr, "Error reading file %s: %s\n", RND_DEV, strerror(error)); ret = error; goto err; } i += ret; } while (i < RAND_BUF_SIZE * sizeof(rndbuf[0])); index = 0; close(fd); return get_random(); err: close(fd); return ret; } double get_random_double(void) { return get_random() / (double)((unsigned int)(-1)); }