init of a and b values
[physik/posic.git] / random / random.c
index c06b98a..292bc69 100644 (file)
@@ -36,6 +36,7 @@ int rand_init(t_random *random,char *randomfile,int logfd) {
                        return -1;
                }
        }
+       random->buffer=NULL;
        random->buffer=malloc(RAND_BUFSIZE*sizeof(unsigned int));
        if(random->buffer==NULL) {
                perror("malloc random buffer");
@@ -55,28 +56,35 @@ int rand_close(t_random *random) {
 
        if(random->buffer) free(random->buffer);
        if(random->fd) close(random->fd);
-       if(random->logfd) close(random->logfd);
+       if(random->logfd>2) close(random->logfd); // could be stdo/e
 
        return 0;
 }
 
 unsigned int rand_get(t_random *random) {
 
+       int left;
+
        if(random->b_ptr==random->buffer+RAND_BUFSIZE) {
                if(random->status&RAND_STAT_VERBOSE)
                        dprintf(random->logfd,
                                "[random] getting new random numbers\n");
-               random->b_ptr=random->buffer;
                if(!(random->status&RAND_STAT_UDEV)) {
                        lseek(random->fd,0,SEEK_SET);
                        dprintf(random->logfd,
                                "[random] warning, rereading random file\n");
                }
-               read(random->fd,random->b_ptr,
-                    RAND_BUFSIZE*sizeof(unsigned int));
+               left=RAND_BUFSIZE*sizeof(unsigned int);
+               while(left) {
+                       left-=read(random->fd,
+                                  random->buffer+\
+                                  RAND_BUFSIZE*sizeof(unsigned int)-left,
+                                  left);
+               }
                if(random->status&RAND_STAT_VERBOSE)
                        dprintf(random->logfd,
                                "[random] got new random numbers\n");
+               random->b_ptr=random->buffer;
        }
 
        return(*(random->b_ptr++));
@@ -84,7 +92,7 @@ unsigned int rand_get(t_random *random) {
 
 double rand_get_double(t_random *random) {
 
-       return(1.0*rand_get(random)/(double)(URAND_MAX+1));
+       return(1.0*rand_get(random)/((long long unsigned int)URAND_MAX+1));
 }
 
 double rand_get_double_linear(t_random *random,double a,double b) {
@@ -101,6 +109,7 @@ double rand_get_gauss(t_random *random) {
                return random->gauss;
        }
 
+       a=0; b=0;
        w=0;
        while((w>=1.0)||(w==0.0)) {
                a=-2.0*rand_get_double(random)+1.0;