ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/urind.c
Revision: 2.3
Committed: Tue Feb 25 02:47:22 2003 UTC (21 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R5
Changes since 2.2: +1 -56 lines
Log Message:
Replaced inline copyright notice with #include "copyright.h"

File Contents

# User Rev Content
1 greg 1.1 #ifndef lint
2 greg 2.2 static const char RCSid[] = "$Id$";
3 greg 1.1 #endif
4     /*
5     * Compute pseudo-asyncronous entry point for urand(3)
6 greg 2.2 */
7    
8 greg 2.3 #include "copyright.h"
9 greg 1.1
10     #define NBITS 32 /* number of bits in an integer */
11    
12     static char bctab[256] = {
13     0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
14     1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
15     1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
16     2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
17     1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
18     2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
19     2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
20     3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
21     1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
22     2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
23     2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
24     3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
25     2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
26     3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
27     3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
28     4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8,
29     };
30    
31     #if NBITS==32
32     #define bitcount(i) (bctab[(i)>>24&0xff]+bctab[(i)>>16&0xff]+ \
33     bctab[(i)>>8&0xff]+bctab[(i)&0xff])
34     #endif
35     #if NBITS==16
36     #define bitcount(i) (bctab[(i)>>8&0xff]+bctab[(i)&0xff])
37     #endif
38    
39    
40     int
41     urind(s, i) /* compute i'th index from seed s */
42     int s, i;
43     {
44     register int ss, k;
45     int left;
46    
47     ss = s*1103515245 + 12345;
48     left = 0;
49     for (k = i/NBITS; k--; ) {
50     left += bitcount(ss);
51     ss = ss*1103515245 + 12345;
52     }
53     for (k = i&(NBITS-1); k--; ss >>= 1)
54     left += ss & 1;
55     if (ss & 1)
56     return(s-left-1);
57     return(s-left+i);
58     }