X-Git-Url: https://hackdaworld.org/gitweb/?a=blobdiff_plain;f=random%2Frandom.c;h=292bc69fda1738da8279d05d7171b47fc0e0ba88;hb=HEAD;hp=c06b98ad11de103e73f466d2f7b7e6241f1a3e38;hpb=3ffe2a08e25fc091b6241885055450009267e2d8;p=physik%2Fposic.git diff --git a/random/random.c b/random/random.c index c06b98a..292bc69 100644 --- a/random/random.c +++ b/random/random.c @@ -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;