ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/urand.c
(Generate patch)

Comparing ray/src/common/urand.c (file contents):
Revision 1.2 by greg, Fri May 17 13:51:14 1991 UTC vs.
Revision 1.6 by greg, Thu Jul 11 16:25:58 1991 UTC

# Line 5 | Line 5 | static char SCCSid[] = "$SunId$ LBL";
5   #endif
6  
7   /*
8 < * Uncorrelated (anticorrelated) random function
8 > * Anticorrelated random function due to Christophe Schlick
9   */
10  
11   #include  "random.h"
# Line 16 | Line 16 | extern char  *malloc();
16  
17   short  *urperm;         /* urand() permutation */
18   int  urmask;            /* bits used in permutation */
19 static int  urorder;    /* number of bits */
19  
20  
21   initurand(size)         /* initialize urand() for size entries */
# Line 49 | Line 48 | int  size;
48  
49  
50   int
51 < urhash(d, n)                    /* hash a set of integer values */
51 > ilhash(d, n)                    /* hash a set of integer values */
52   register int  *d;
53   register int  n;
54   {
55          static int  tab[8] = {13623,353,1637,5831,2314,3887,5832,8737};
56 <        register unsigned  hval;
56 >        register int  hval;
57  
58          hval = 0;
59          while (n-- > 0)
60                  hval += *d++ * tab[n&7];
61 <        return(hval & urmask);
61 >        return(hval);
62 > }
63 >
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   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines