@@ -6,6 +6,7 @@ rand.c: By Bob Jenkins. My random number generator, ISAAC. Public Domain
6
6
970719: use context, not global variables, for internal state
7
7
980324: make a portable version
8
8
010626: Note this is public domain
9
+ 100725: Mask on use of >32 bits, not on assignment: from Paul Eggert
9
10
------------------------------------------------------------------------------
10
11
*/
11
12
#ifndef STANDARD
@@ -27,37 +28,37 @@ rand.c: By Bob Jenkins. My random number generator, ISAAC. Public Domain
27
28
28
29
void isaac (randctx *ctx)
29
30
{
30
- register ub4 a,b,x,y,*m,*mm,*m2,*r,*mend;
31
+ ub4 a,b,x,y,*m,*mm,*m2,*r,*mend;
31
32
mm=ctx->randmem ; r=ctx->randrsl ;
32
- a = ctx->randa ; b = ( ctx->randb + (++ctx->randc )) & 0xffffffff ;
33
+ a = ctx->randa ; b = ctx->randb + (++ctx->randc );
33
34
for (m = mm, mend = m2 = m+(RANDSIZ/2 ); m<mend; )
34
35
{
35
36
rngstep ( a<<13 , a, b, mm, m, m2, r, x);
36
- rngstep ( a >>6 , a, b, mm, m, m2, r, x);
37
+ rngstep ( (a & 0xffffffff ) >>6 , a, b, mm, m, m2, r, x);
37
38
rngstep ( a<<2 , a, b, mm, m, m2, r, x);
38
- rngstep ( a >>16 , a, b, mm, m, m2, r, x);
39
+ rngstep ( (a & 0xffffffff ) >>16 , a, b, mm, m, m2, r, x);
39
40
}
40
41
for (m2 = mm; m2<mend; )
41
42
{
42
43
rngstep ( a<<13 , a, b, mm, m, m2, r, x);
43
- rngstep ( a >>6 , a, b, mm, m, m2, r, x);
44
+ rngstep ( (a & 0xffffffff ) >>6 , a, b, mm, m, m2, r, x);
44
45
rngstep ( a<<2 , a, b, mm, m, m2, r, x);
45
- rngstep ( a >>16 , a, b, mm, m, m2, r, x);
46
+ rngstep ( (a & 0xffffffff ) >>16 , a, b, mm, m, m2, r, x);
46
47
}
47
48
ctx->randb = b; ctx->randa = a;
48
49
}
49
50
50
51
51
52
#define mix (a,b,c,d,e,f,g,h ) \
52
53
{ \
53
- a^=b<<11 ; d+=a; b+=c; \
54
- b^=c >>2 ; e+=b; c+=d; \
55
- c^=d<<8 ; f+=c; d+=e; \
56
- d^=e >>16 ; g+=d; e+=f; \
57
- e^=f<<10 ; h+=e; f+=g; \
58
- f^=g >>4 ; a+=f; g+=h; \
59
- g^=h<<8 ; b+=g; h+=a; \
60
- h^=a >>9 ; c+=h; a+=b; \
54
+ a^=b<<11 ; d+=a; b+=c; \
55
+ b^=(c& 0xffffffff ) >>2 ; e+=b; c+=d; \
56
+ c^=d<<8 ; f+=c; d+=e; \
57
+ d^=(e& 0xffffffff ) >>16 ; g+=d; e+=f; \
58
+ e^=f<<10 ; h+=e; f+=g; \
59
+ f^=(g& 0xffffffff ) >>4 ; a+=f; g+=h; \
60
+ g^=h<<8 ; b+=g; h+=a; \
61
+ h^=(a& 0xffffffff ) >>9 ; c+=h; a+=b; \
61
62
}
62
63
63
64
/* if (flag==TRUE), then use the contents of randrsl[] to initialize mm[]. */
@@ -81,17 +82,21 @@ void randinit(randctx *ctx, word flag)
81
82
/* initialize using the contents of r[] as the seed */
82
83
for (i=0 ; i<RANDSIZ; i+=8 )
83
84
{
84
- a+=r[i ]; b+=r[i+1 ]; c+=r[i+2 ]; d+=r[i+3 ];
85
- e+=r[i+4 ]; f+=r[i+5 ]; g+=r[i+6 ]; h+=r[i+7 ];
85
+ a+=r[i ]; b+=r[i+1 ];
86
+ c+=r[i+2 ]; d+=r[i+3 ];
87
+ e+=r[i+4 ]; f+=r[i+5 ];
88
+ g+=r[i+6 ]; h+=r[i+7 ];
86
89
mix (a,b,c,d,e,f,g,h);
87
90
m[i ]=a; m[i+1 ]=b; m[i+2 ]=c; m[i+3 ]=d;
88
91
m[i+4 ]=e; m[i+5 ]=f; m[i+6 ]=g; m[i+7 ]=h;
89
92
}
90
93
/* do a second pass to make all of the seed affect all of m */
91
94
for (i=0 ; i<RANDSIZ; i+=8 )
92
95
{
93
- a+=m[i ]; b+=m[i+1 ]; c+=m[i+2 ]; d+=m[i+3 ];
94
- e+=m[i+4 ]; f+=m[i+5 ]; g+=m[i+6 ]; h+=m[i+7 ];
96
+ a+=m[i ]; b+=m[i+1 ];
97
+ c+=m[i+2 ]; d+=m[i+3 ];
98
+ e+=m[i+4 ]; f+=m[i+5 ];
99
+ g+=m[i+6 ]; h+=m[i+7 ];
95
100
mix (a,b,c,d,e,f,g,h);
96
101
m[i ]=a; m[i+1 ]=b; m[i+2 ]=c; m[i+3 ]=d;
97
102
m[i+4 ]=e; m[i+5 ]=f; m[i+6 ]=g; m[i+7 ]=h;
0 commit comments