summaryrefslogtreecommitdiff
path: root/examples/oil-random.c
blob: 9bbaee7a8b6eb2f9c8cd2108a55ba677434697f8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104



#include <liboil/liboil.h>
#include <liboil/liboildebug.h>
#include <time.h>
#include <stdio.h>
#include <string.h>

typedef struct _OilRandomState OilRandomState;

struct _OilRandomState {
  int index;
  uint32_t mt[624];
  uint32_t bits[624];
};

OilRandomState state;

static void _oil_random_init (void);
uint32_t oil_random_get_int (OilRandomState *state);
void oil_random_get_bits (OilRandomState *state, uint8_t *dest, int n);

int
main (int argc, char *argv[])
{
  int i;
  uint32_t a[10];

  oil_init();

  _oil_random_init();

  for(i=0;i<10;i++){
    printf("%d\n", oil_random_get_int(&state));
  }

  oil_random_get_bits (&state, (void *)a, 10*4);
  for(i=0;i<10;i++){
    printf("%d\n", a[i]);
  }

  return 0;
}


void
oil_random_state_seed (OilRandomState *state, uint32_t seed)
{
  uint32_t *mt = state->mt;
  int i;

  mt[0] = seed;
  for(i=1;i<624;i++) {
    mt[i] = (1812433253UL * (mt[i-1] ^ (mt[i-1] >> 30)) + i);
  }
  oil_mt19937 (state->bits, state->mt);
  state->index = 0;
}

static void
_oil_random_init (void)
{
  int seed;

  seed = time(NULL);
  OIL_ERROR("seed is %d", seed);

  oil_random_state_seed (&state, seed);
}

uint32_t
oil_random_get_int (OilRandomState *state)
{
  if (state->index >= 624) {
    oil_mt19937 (state->bits, state->mt);
    state->index = 0;
  }
  return state->bits[state->index++];
}

void
oil_random_get_bits (OilRandomState *state, uint8_t *dest, int n)
{
  int i = state->index * 4;
  int m;

  while(n > 0) {
    if (i >= 624*4) {
      oil_mt19937 (state->bits, state->mt);
      i = 0;
    }

    m = n;
    if (m > 624*4 - i) m = 624*4 - i;

    memcpy (dest, ((uint8_t *)state->bits) + i, m);
    i += m;
    n -= m;
  }
  state->index = (i+3)/4;
}