--
[physik/morpheus.git] / random.c
1 /*
2  * random.c - functions to get random values
3  *
4  */
5
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <unistd.h>
10 #include <sys/types.h>
11 #include <unistd.h>
12
13 #include "defines.h"
14
15 /* global and extern variables */
16 extern u32 gr;
17 extern int random_fd;
18 extern u32 *rand_buf,*rand_current;
19 extern char random_file[MAX_CHARS_RANDOM_FILE];
20
21 /* return random integer between 0 - max-1 */
22 u32 rand_get(u32 max) 
23 {
24  if(rand_current>=rand_buf+(RAND_BUF_SIZE/sizeof(u32)))
25  {
26   printfd("debug: reading new random bytes\n");
27   if(read(random_fd,rand_buf,RAND_BUF_SIZE)!=RAND_BUF_SIZE)
28   {
29    if(strcmp(random_file,""))
30    {
31     puts("random file end, starting over ...");
32     lseek(random_fd,0,SEEK_SET);
33    } else
34    {
35     puts("failed reading 1 mega bytes of random data");
36     return -23;
37    }
38   }
39   printfd("debug: finished reading random bytes\n");
40   rand_current=rand_buf;
41  }
42  /* cells numbered 0...max-1 */
43  return((u32)(*(rand_current++)*(max*1.0/URAND_MAX)));
44 }
45
46 /* get z value (linear growth of probability with depths) */
47 u32 rand_get_lgp(int slope,int start,u32 z_max)
48 {
49  int z;
50  u32 i,weighted_sum_z;
51  weighted_sum_z=z_max*start+slope*gr;
52  z=rand_get(weighted_sum_z)+1; /* +1 as rand_get returns values 0...max-1 */
53  for(i=1;;i++)
54  {
55   z-=(start+i*slope);
56   if(z<=0) break;
57  }
58  return(i-1); /* return values 0...z_cell-1 */
59 }
60