ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/urand.c
Revision: 1.6
Committed: Thu Jul 11 16:25:58 1991 UTC (32 years, 10 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.5: +52 -0 lines
Log Message:
added urind function for multi-dimensional sampling

File Contents

# User Rev Content
1 greg 1.1 /* Copyright (c) 1991 Regents of the University of California */
2    
3     #ifndef lint
4     static char SCCSid[] = "$SunId$ LBL";
5     #endif
6    
7     /*
8 greg 1.5 * Anticorrelated random function due to Christophe Schlick
9 greg 1.1 */
10    
11     #include "random.h"
12    
13     #define NULL 0
14    
15     extern char *malloc();
16    
17     short *urperm; /* urand() permutation */
18     int urmask; /* bits used in permutation */
19    
20    
21     initurand(size) /* initialize urand() for size entries */
22     int size;
23     {
24     int order, n;
25     register int i, offset;
26    
27     size--;
28     for (i = 1; size >>= 1; i++)
29     ;
30     order = i;
31     urmask = (1<<i) - 1;
32     urperm = (short *)malloc((urmask+1)*sizeof(short));
33     if (urperm == NULL) {
34     eputs("out of memory in initurand\n");
35     quit(1);
36     }
37     urperm[0] = 0;
38     for (n = 1, offset = 1; n <= order; n++, offset <<= 1)
39     for (i = offset; i--; ) {
40     urperm[i] =
41     urperm[i+offset] = 2*urperm[i];
42     if (random() & 0x4000)
43     urperm[i]++;
44     else
45     urperm[i+offset]++;
46     }
47 greg 1.2 }
48    
49    
50     int
51 greg 1.3 ilhash(d, n) /* hash a set of integer values */
52 greg 1.2 register int *d;
53     register int n;
54     {
55     static int tab[8] = {13623,353,1637,5831,2314,3887,5832,8737};
56 greg 1.4 register int hval;
57 greg 1.2
58     hval = 0;
59     while (n-- > 0)
60     hval += *d++ * tab[n&7];
61 greg 1.3 return(hval);
62 greg 1.1 }
63 greg 1.6
64    
65     static char bctab[256] = {
66     0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
67     1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
68     1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
69     2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
70     1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
71     2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
72     2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
73     3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
74     1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
75     2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
76     2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
77     3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
78     2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
79     3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
80     3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
81     4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8,
82     };
83    
84    
85     #define NBITS 32
86    
87     #if NBITS==32
88     #define bitcount(i) (bctab[(i)>>24&0xff]+bctab[(i)>>16&0xff]+ \
89     bctab[(i)>>8&0xff]+bctab[(i)&0xff])
90     #endif
91     #if NBITS==16
92     #define bitcount(i) (bctab[(i)>>8&0xff]+bctab[(i)&0xff])
93     #endif
94    
95    
96     int
97     urind(s, i) /* compute i'th index from seed s */
98     int s, i;
99     {
100     register int ss, k;
101     int left;
102    
103     ss = s*1103515245 + 12345;
104     left = 0;
105     for (k = i/NBITS; k--; ) {
106     left += bitcount(ss);
107     ss = ss*1103515245 + 12345;
108     }
109     for (k = i&(NBITS-1); k--; ss >>= 1)
110     left += ss & 1;
111     if (ss & 1)
112     return(s-left-1);
113     return(s-left+i);
114     }