| 130 | } |
| 131 | |
| 132 | int Random_Next(RNGState* seed, int n) { |
| 133 | cc_int64 raw; |
| 134 | int bits, val; |
| 135 | |
| 136 | if ((n & -n) == n) { /* i.e., n is a power of 2 */ |
| 137 | *seed = (*seed * RND_VALUE + 0xBLL) & RND_MASK; |
| 138 | raw = (cc_int64)(*seed >> (48 - 31)); |
| 139 | return (int)((n * raw) >> 31); |
| 140 | } |
| 141 | |
| 142 | do { |
| 143 | *seed = (*seed * RND_VALUE + 0xBLL) & RND_MASK; |
| 144 | bits = (int)(*seed >> (48 - 31)); |
| 145 | val = bits % n; |
| 146 | } while (bits - val + (n - 1) < 0); |
| 147 | return val; |
| 148 | } |
| 149 | |
| 150 | float Random_Float(RNGState* seed) { |
| 151 | int raw; |
no outgoing calls
no test coverage detected