2 * Routines to get randomness.
11 #include "sanitise.h" // interesting_numbers
14 unsigned int rand_bool(void)
19 static unsigned int rand_single_bit(unsigned char size
)
21 return (1L << (rand() % size
));
25 * set N bits, where N= rand(0 - WORDSIZE/2)
27 static unsigned long randbits(int limit
)
29 unsigned int num
= rand() % limit
/ 2;
33 for (i
= 0; i
< num
; i
++)
34 r
|= (1 << (rand() % (limit
- 1)));
40 * Based on very similar routine stolen from iknowthis. Thanks Tavis.
42 static unsigned long taviso(void)
47 case 0: r
= rand() & rand();
54 case 1: r
= rand() % rand();
61 case 2: r
= rand() | rand();
83 * Pick 8 random bytes, and concatenate them into a long.
85 static unsigned long rand8x8(void)
87 unsigned long r
= 0UL;
90 for (i
= (rand() % 7) + 1; i
> 0; --i
)
91 r
= (r
<< 8) | rand() % 256;
97 * Pick 1 random byte, and repeat it through a long.
99 static unsigned long rept8(unsigned int num
)
101 unsigned long r
= 0UL;
106 for (i
= rand() % (num
- 1) ; i
> 0; --i
)
113 * "selector" function for 32bit random.
114 * only called from rand32()
116 static unsigned int __rand32(void)
120 switch (rand() % 7) {
121 case 0: r
= rand_single_bit(32);
123 case 1: r
= randbits(32);
127 case 3: r
= taviso();
129 case 4: r
= rand8x8();
131 case 5: r
= rept8(4);
133 case 6: return get_interesting_32bit_value();
142 * Generate, and munge a 32bit number.
144 unsigned int rand32(void)
156 for (i
= 0; i
< rounds
; i
++) {
157 switch (rand_bool()) {
158 case 0: r
|= __rand32();
160 case 1: r
^= __rand32();
168 /* Sometimes deduct it from INT_MAX */
172 /* Sometimes flip sign */
177 switch (rand() % 4) {
182 case 2: r
&= 0xffffff;
192 * Generate and munge a 64bit number.
203 /* 33:64-bit ranges. */
204 switch (rand() % 7) {
205 case 0: r
= rand_single_bit(64);
207 case 1: r
= randbits(64);
209 case 2: r
= rand32() | rand32() << 31;
211 case 3: r
= taviso();
213 case 4: r
= rand8x8();
215 case 5: r
= rept8(8);
217 /* Sometimes pick a not-so-random number. */
218 case 6: return get_interesting_value();
224 switch (rand() % 4) {
225 case 0: r
&= 0x000000ffffffffffULL
;
227 case 1: r
&= 0x0000ffffffffffffULL
;
229 case 2: r
&= 0x00ffffffffffffffULL
;
236 /* Sometimes invert the generated number. */
240 /* increase distribution in MSB */
246 for (i
= 0; i
< rounds
; i
++)
247 r
|= (1L << ((__WORDSIZE
- 1) - (rand() % 8)));
250 /* randomly flip sign bit. */
252 r
|= (1L << (__WORDSIZE
- 1));