Build on wheezy, and presumably precise
[invirt/third/libt4.git] / random.cc
1 #include "mutex.h"
2 #include <stdlib.h>
3 #include "rpc/slock.h"
4 #include <stdint.h>
5
6 static mutex rand_m;
7
8 void srand_safe(unsigned int seed) {
9     ScopedLock s(rand_m);
10     srandom(seed);
11 }
12
13 // RAND_MAX is guaranteed to be at least 32767
14 // but math with rand() is annoying.
15 // Here's a canned solution from
16 // http://www.azillionmonkeys.com/qed/random.html
17 // which gives uniform numbers in [0, r)
18
19 #define RS_SCALE (1.0 / (1.0 + RAND_MAX))
20
21 double drand (void) {
22     double d;
23     do {
24        d = (((random() * RS_SCALE) + random()) * RS_SCALE + random()) * RS_SCALE;
25     } while (d >= 1); /* Round off */
26     return d;
27 }
28
29 #define irand(x) ((unsigned int) ((x) * drand()))
30
31 // use this to construct a 32-bit thread-safe RNG
32 #define RAND32 ((uint32_t)irand(1ul<<32))
33 uint32_t rand32_safe() {
34     ScopedLock s(rand_m);
35     return RAND32;
36 }