乱数生成

手軽に8bitの乱数っぽいものを作りたい。

N := (N xor $AA) + 73;

http://www.programmersheaven.com/mb/Console/100277/100277/nes-random-numbers/

試す。

irb(main):001:0> hash = {}; (0..0x100).inject(0) {|rnd, i| print rnd, ' '; print "\n#{i} / cycle\n" or break if hash[rnd]; hash[rnd] = ((rnd^0xaa) + 73) % 0x100 }
0 243 162 81 68 55 230 149 136 107 10 233 140 111 14 237 144 131 114 33 212 199 182 101 24 251 154 121 28 255 158 125 32 211 194 177 100 23 6 245 168 75 42 201 172 79 46 205 176 99 18 1 244 167 86 69 56 219 186 89 60 223 190 93 64 51 226 145 132 119 38 213 200 171 74 41 204 175 78 45 208 195 178 97 20 7 246 165 88 59 218 185 92 63 222 189 96 19 2 241 164 87 70 53 232 139 106 9 236 143 110 13 240 163 82 65 52 231 150 133 120 27 250 153 124 31 254 157 128 115 34 209 196 183 102 21 8 235 138 105 12 239 142 109 16 3 242 161 84 71 54 229 152 123 26 249 156 127 30 253 160 83 66 49 228 151 134 117 40 203 170 73 44 207 174 77 48 227 146 129 116 39 214 197 184 91 58 217 188 95 62 221 192 179 98 17 4 247 166 85 72 43 202 169 76 47 206 173 80 67 50 225 148 135 118 37 216 187 90 57 220 191 94 61 224 147 130 113 36 215 198 181 104 11 234 137 108 15 238 141 112 35 210 193 180 103 22 5 248 155 122 25 252 159 126 29 0
256 / cycle

おー1周した。いや偶奇があってればなんでも1周するっぽいな。LFSRっていうのを理解すればいいのかな。
線形帰還シフトレジスタ - Wikipedia
まあいいや。
http://codebase64.org/doku.php?id=base:6502_6510_maths#random_numbers
そんな感じのお手軽乱数を16bitなり32bitなりで作ってそのうちの8bitを使えば、という感じか。