X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=shell%2Frandom.h;h=c4eb44c133bb836e4b6d30ba497639444f49610b;hb=5b2cc0aaee6985431d9bab1b49ceea7e1fa1d7af;hp=e22a2e88b53ffca49984c924d6d83772d9c7a8d1;hpb=76ace254e171ee9ca7a13f36335ccad9cc6ae6e1;p=oweals%2Fbusybox.git diff --git a/shell/random.h b/shell/random.h index e22a2e88b..c4eb44c13 100644 --- a/shell/random.h +++ b/shell/random.h @@ -4,22 +4,38 @@ * * Copyright (C) 2009 Denys Vlasenko * - * Licensed under GPLv2, see file LICENSE in this tarball for details. + * Licensed under GPLv2, see file LICENSE in this source tree. */ +#ifndef SHELL_RANDOM_H +#define SHELL_RANDOM_H 1 + +PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN typedef struct random_t { - /* Random number generators */ - int32_t galois_LFSR; /* Galois LFSR (fast but weak). signed! */ - uint32_t LCG; /* LCG (fast but weak) */ + /* State of random number generators: */ + + /* Galois LFSR (fast but weak) */ + int32_t galois_LFSR; /* must be signed! */ + + /* LCG (fast but weak) */ + uint32_t LCG; + + /* 64-bit xorshift (fast, moderate strength) */ + uint32_t xs64_x; + uint32_t xs64_y; } random_t; #define UNINITED_RANDOM_T(rnd) \ ((rnd)->galois_LFSR == 0) #define INIT_RANDOM_T(rnd, nonzero, v) \ - ((rnd)->galois_LFSR = (nonzero), (rnd)->LCG = (v)) + ((rnd)->galois_LFSR = (rnd)->xs64_x = (nonzero), (rnd)->LCG = (rnd)->xs64_y = (v)) #define CLEAR_RANDOM_T(rnd) \ ((rnd)->galois_LFSR = 0) uint32_t next_random(random_t *rnd) FAST_FUNC; + +POP_SAVED_FUNCTION_VISIBILITY + +#endif