00001 #include <assert.h>
00002 #include <math.h>
00003 #include <stdio.h>
00004 #include <stdlib.h>
00005 #include <time.h>
00006 #include "random.h"
00007
00008 void set_seed (unsigned int seed)
00009 {
00010 if (seed == 0 || seed > RAND_MAX) {
00011
00012 time_t t = time(NULL);
00013 assert(t > 0);
00014 seed = t;
00015 }
00016 fprintf(stderr, "random seed = %u\n", seed);
00017 srand(seed);
00018 }
00019
00020 REAL randn () {
00021 static int saved = 0;
00022 static REAL saved_val;
00023 REAL rsq, v1, v2, ratio;
00024
00025 if (saved) {
00026 saved = 0;
00027 return saved_val;
00028 }
00029
00030 do {
00031 v1 = 2*randu()-1;
00032 v2 = 2*randu()-1;
00033 rsq = v1*v1 + v2*v2;
00034 } while (rsq >= 1 || rsq == 0);
00035 ratio = sqrt(-2 * log(rsq)/rsq);
00036
00037 saved_val = v1 * ratio;
00038 saved = 1;
00039 return v2 * ratio;
00040 }