/* ============================================================================ Name : kongruencia.c Author : Stippinger Marcell Version : 1.0 Copyright : BME-TTK FI SzamSzim gyak segedanyag Description : multiplicative congruential RNG in C, Ansi-style ============================================================================ */ #include "kongruencia.h" #include /* Allocate an RNG and initialize parameters */ my_rng* my_rng_alloc(unsigned int a, unsigned int m, unsigned int c) { my_rng* r; r = calloc(1,sizeof(my_rng)); if (r!=NULL) { if ((a!=0)&&(m!=0)){ r->a = a; r->m = m; r->c = c; } else { // Default values from the course slides r->a = 16807; r->m = 2147483647; r->c = 0; } } return r; } /* Set seed */ void my_rng_set(my_rng* r, unsigned int seed) { r->seed = seed; } /* Get a random int */ unsigned int my_rng_get(my_rng* r) { r->seed = (r->a*r->seed+r->c)%r->m; return r->seed; } /* Get boundaries */ unsigned int my_rng_min(my_rng* r) { return 0; } unsigned int my_rng_max(my_rng* r) { return r->m-1; } /* Get a random double in [0,1) */ double my_rng_uniform(my_rng* r) { r->seed = (r->a*r->seed+r->c)%r->m; return r->seed/(double)(r->m); } /* Free allocated space */ void my_rng_free(my_rng* r) { free(r); }