#pragma once
#include <math.h>
#include <stdint.h>
#define RK_STATE_LEN 624
#define N 624
#define M 397
#define MATRIX_A 0x9908b0dfUL
#define UPPER_MASK 0x80000000UL
#define LOWER_MASK 0x7fffffffUL
typedef struct s_mt19937_state {
uint32_t key[RK_STATE_LEN];
int pos;
} mt19937_state;
extern void mt19937_seed(mt19937_state *state, uint32_t seed);
extern void mt19937_gen(mt19937_state *state);
uint32_t mt19937_next(mt19937_state *state);
extern void mt19937_init_by_array(mt19937_state *state, uint32_t *init_key,
int key_length);
uint64_t mt19937_next64(mt19937_state *state);
uint32_t mt19937_next32(mt19937_state *state);
double mt19937_next_double(mt19937_state *state);
void mt19937_jump(mt19937_state *state);