Merge pull request #113 from gitter-badger/gitter-badge
[sddekit.git] / src / sd_rng.c
blob964288aa9890e06049c465229735ef0495916fbf
1 /* copyright 2016 Apache 2 sddekit authors */
3 #include "sddekit.h"
5 #include "randomkit.h"
7 struct rng_data {
8 uint64_t ncall;
9 uint32_t seed;
10 rk_state rks;
13 static void rng_seed(sd_rng *r, uint32_t seed)
15 struct rng_data *d = r->ptr;
16 d->seed = seed;
17 d->ncall = 0;
18 rk_seed(seed, &d->rks);
21 static double rng_norm(sd_rng *r)
23 struct rng_data *d = r->ptr;
24 return rk_gauss(&d->rks);
27 static void rng_fill_norm(sd_rng *r, uint32_t n, double *x)
29 uint32_t i;
30 struct rng_data *d = r->ptr;
31 for (i=0; i<n; i++)
32 x[i] = rk_gauss(&d->rks);
35 static void rng_free(sd_rng *r)
37 sd_free(r->ptr);
38 sd_free(r);
41 static uint32_t rng_nbytes(sd_rng *r)
43 (void) r;
44 return sizeof(struct rng_data) + sizeof(sd_rng);
47 static sd_rng rng_default = {
48 .ptr = NULL,
49 .seed = &rng_seed,
50 .norm = &rng_norm,
51 .fill_norm = &rng_fill_norm,
52 .nbytes = &rng_nbytes,
53 .free = &rng_free
56 sd_rng *sd_rng_new_default()
58 sd_rng *r;
59 if ((r = sd_malloc (sizeof(sd_rng))) == NULL
60 || (*r = rng_default, 0)
61 || (r->ptr = sd_malloc (sizeof(struct rng_data))) == NULL)
63 sd_free(r);
64 sd_err("alloc rng failed.");
65 return NULL;
67 return r;