aboutsummaryrefslogtreecommitdiff
path: root/src/gunner/rand_sys.c
blob: ffd2a25324c9020acddaea29a10e4c26a573f6df (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
typedef struct _FILETIME {
  u32 dwLowDateTime;
  u32 dwHighDateTime;
} FILETIME;

#define W32(r) __declspec(dllimport) r __stdcall
W32(void) GetSystemTimeAsFileTime(FILETIME *);

static u32 state[2];

void rand_seed(void)
{
	FILETIME t; 
	GetSystemTimeAsFileTime(&t);
	
	u32 val = t.dwLowDateTime;
	val ^= val >> 16;
    val *= 0x85ebca6b;
    val ^= val >> 13;
    val *= 0xc2b2ae35;
    val ^= val >> 16;
	
	state[0] = val;
	state[1] = val ^ 0x49616e42U;
}

u32 rand_u32(void)
{
	state[0] = (state[0] << 16) + (state[0] >> 16);
    state[0] += state[1];
    state[1] += state[0];
    return state[0];
}

i32 rand_range(i32 min, i32 max)
{
	u32 range = (u32)(max - min + 1);
    u32 num = rand_u32() % range;

    return min + (i32)num;
}