Implementation
Doom by id Software may be a cult classic, but the way it handles random numbers is unexpectedly primitive.
Within the game's binary is a table listing 256 "random" bytes, and the game keeps track of the current position in the table. When a random number is needed, it simply returns the value at the current position and moves to the next entry. No other calculations are done.
This might seem like a terrible way to handle randomness, especially in a video game, but it does allow for some interesting features. For example, this ensures that online games are syncronized, and it's also the secret behind Doom's ability to record gameplay.
Test Results
SEED | Number indicates how many results could be obtained before the generator fell into a loop. |
1138 | 256 | FAIL |
65535 | 256 | FAIL |
8675309 | 256 | FAIL |
16777216 | 256 | FAIL |
123456789 | 256 | FAIL |
|
This is a surprisingly good distribution, suggesting that the table was created using values from an actual PRNG. |
SEED | Minimum of 6,000 darts placed needed to pass. |
1138 | 126 | FAIL |
65535 | 126 | FAIL |
8675309 | 126 | FAIL |
16777216 | 126 | FAIL |
123456789 | 126 | FAIL |
SEED | 70% or higher required to pass. |
1138 | 4% | FAIL |
65535 | 4% | FAIL |
8675309 | 4% | FAIL |
16777216 | 4% | FAIL |
123456789 | 4% | FAIL |
|
With its small range of values, Doom's PRNG didn't have a chance at passing this test. |
0 | 8 | 109 | 220 | 222 | 241 | 149 | 107 | 75 | 248 | 254 | 140 | 16 | 66 | 74 | 21 | 211 | 47 | 80 | 242 |
154 | 27 | 205 | 128 | 161 | 89 | 77 | 36 | 95 | 110 | 85 | 48 | 212 | 140 | 211 | 249 | 22 | 79 | 200 | 50 |
28 | 188 | 52 | 140 | 202 | 120 | 68 | 145 | 62 | 70 | 184 | 190 | 91 | 197 | 152 | 224 | 149 | 104 | 25 | 178 |
252 | 182 | 202 | 182 | 141 | 197 | 4 | 81 | 181 | 242 | 145 | 42 | 39 | 227 | 156 | 198 | 225 | 193 | 219 | 93 |
122 | 175 | 249 | 0 | 175 | 143 | 70 | 239 | 46 | 246 | 163 | 53 | 163 | 109 | 168 | 135 | 2 | 235 | 25 | 92 |
20 | 145 | 138 | 77 | 69 | 166 | 78 | 176 | 173 | 212 | 166 | 113 | 94 | 161 | 41 | 50 | 239 | 49 | 111 | 164 |
70 | 60 | 2 | 37 | 171 | 75 | 136 | 156 | 11 | 56 | 42 | 146 | 138 | 229 | 73 | 146 | 77 | 61 | 98 | 196 |
135 | 106 | 63 | 197 | 195 | 86 | 96 | 203 | 113 | 101 | 170 | 247 | 181 | 113 | 80 | 250 | 108 | 7 | 255 | 237 |
129 | 226 | 79 | 107 | 112 | 166 | 103 | 241 | 24 | 223 | 239 | 120 | 198 | 58 | 60 | 82 | 128 | 3 | 184 | 66 |
143 | 224 | 145 | 224 | 81 | 206 | 163 | 45 | 63 | 90 | 168 | 114 | 59 | 33 | 159 | 95 | 28 | 139 | 123 | 98 |
125 | 196 | 15 | 70 | 194 | 253 | 54 | 14 | 109 | 226 | 71 | 17 | 161 | 93 | 186 | 87 | 244 | 138 | 20 | 52 |
123 | 251 | 26 | 36 | 17 | 46 | 52 | 231 | 232 | 76 | 31 | 221 | 84 | 37 | 216 | 165 | 212 | 106 | 197 | 242 |
98 | 43 | 39 | 175 | 254 | 145 | 190 | 84 | 118 | 222 | 187 | 136 | 120 | 163 | 236 | 249 | 0 | 8 | 109 | 220 |
222 | 241 | 149 | 107 | 75 | 248 | 254 | 140 | 16 | 66 | 74 | 21 | 211 | 47 | 80 | 242 | 154 | 27 | 205 | 128 |
161 | 89 | 77 | 36 | 95 | 110 | 85 | 48 | 212 | 140 | 211 | 249 | 22 | 79 | 200 | 50 | 28 | 188 | 52 | 140 |
202 | 120 | 68 | 145 | 62 | 70 | 184 | 190 | 91 | 197 | 152 | 224 | 149 | 104 | 25 | 178 | 252 | 182 | 202 | 182 |
141 | 197 | 4 | 81 | 181 | 242 | 145 | 42 | 39 | 227 | 156 | 198 | 225 | 193 | 219 | 93 | 122 | 175 | 249 | 0 |
175 | 143 | 70 | 239 | 46 | 246 | 163 | 53 | 163 | 109 | 168 | 135 | 2 | 235 | 25 | 92 | 20 | 145 | 138 | 77 |
69 | 166 | 78 | 176 | 173 | 212 | 166 | 113 | 94 | 161 | 41 | 50 | 239 | 49 | 111 | 164 | 70 | 60 | 2 | 37 |
171 | 75 | 136 | 156 | 11 | 56 | 42 | 146 | 138 | 229 | 73 | 146 | 77 | 61 | 98 | 196 | 135 | 106 | 63 | 197 |