]>
jfr.im git - irc/quakenet/newserv.git/blob - lib/prng.h
2 ------------------------------------------------------------------------------
3 rand.h: definitions for a random number generator
4 By Bob Jenkins, 1996, Public Domain
6 960327: Creation (addition of randinit, really)
7 970719: use context, not global variables, for internal state
8 980324: renamed seed to flag
9 980605: recommend RANDSIZL=4 for noncryptography.
10 010626: note this is public domain
11 ------------------------------------------------------------------------------
23 typedef unsigned long long ub8
;
24 #define UB8MAXVAL 0xffffffffffffffffLL
26 typedef signed long long sb8
;
27 #define SB8MAXVAL 0x7fffffffffffffffLL
28 typedef unsigned long int ub4
; /* unsigned 4-byte quantities */
29 #define UB4MAXVAL 0xffffffff
30 typedef signed long int sb4
;
32 #define SB4MAXVAL 0x7fffffff
33 typedef unsigned short int ub2
;
34 #define UB2MAXVAL 0xffff
36 typedef signed short int sb2
;
37 #define SB2MAXVAL 0x7fff
38 typedef unsigned char ub1
;
39 #define UB1MAXVAL 0xff
41 typedef signed char sb1
; /* signed 1-byte quantities */
42 #define SB1MAXVAL 0x7f
43 typedef int word
; /* fastest type available */
45 #define bis(target,mask) ((target) |= (mask))
46 #define bic(target,mask) ((target) &= ~(mask))
47 #define bit(target,mask) ((target) & (mask))
49 # define min(a,b) (((a)<(b)) ? (a) : (b))
52 # define max(a,b) (((a)<(b)) ? (b) : (a))
55 # define align(a) (((ub4)a+(sizeof(void *)-1))&(~(sizeof(void *)-1)))
58 # define abs(a) (((a)>0) ? (a) : -(a))
62 #define SUCCESS 0 /* 1 on VAX */
68 #define RANDSIZL (8) /* I recommend 8 for crypto, 4 for simulations */
69 #define RANDSIZ (1<<RANDSIZL)
71 /* context of random number generator */
81 typedef struct prngctx prngctx
;
84 ------------------------------------------------------------------------------
85 If (flag==TRUE), then use the contents of randrsl[0..RANDSIZ-1] as the seed.
86 ------------------------------------------------------------------------------
88 void prnginit(/*_ prngctx *r, word flag _*/);
90 void isaac(/*_ prngctx *r _*/);
94 ------------------------------------------------------------------------------
95 Call rand(/o_ prngctx *r _o/) to retrieve a single 32-bit random value
96 ------------------------------------------------------------------------------
100 (isaac(r), (r)->randcnt=RANDSIZ-1, (r)->randrsl[(r)->randcnt]) : \
101 (r)->randrsl[(r)->randcnt])