# 提取伪随机数 defextract_number(self): if self.mti == 0: self.twist() y = self.mt[self.mti] y = y ^ y >> 11 y = y ^ y << 7 & 2636928640 y = y ^ y << 15 & 4022730752 y = y ^ y >> 18 self.mti = (self.mti + 1) % 624 return _int32(y)
# 对状态进行旋转 deftwist(self): for i in range(0, 624): #y是当前数的第1位和下一个数的最后31位 y = _int32((self.mt[i] & 0x80000000) + (self.mt[(i + 1) % 624] & 0x7fffffff)) #先将y右移一位,再与第397位数异或 self.mt[i] = (y >> 1) ^ self.mt[(i + 397) % 624] #如果y为奇数,则与0x9908b0df异或 if y % 2 != 0: self.mt[i] = self.mt[i] ^ 0x9908b0df
python 中内置的 Random 类就是采用了 MT19937 算法, getrandbits(32) 方法可以获得一个 32 位随机数。
o = 2080737669 y = o ^ o << 15 & 4022730752 tmp = y for i in range(32 // 15): # (y<<15)&40022730752 每次可以恢复y的15位 y = tmp ^ y << 15 & 4022730752 print(y==o)
# right shift inverse definverse_right(res, shift, bits=32): tmp = res for i in range(bits // shift): tmp = res ^ tmp >> shift return tmp
# right shift with mask inverse definverse_right_mask(res, shift, mask, bits=32): tmp = res for i in range(bits // shift): tmp = res ^ tmp >> shift & mask return tmp
# left shift inverse definverse_left(res, shift, bits=32): tmp = res for i in range(bits // shift): tmp = res ^ tmp << shift return tmp
# left shift with mask inverse definverse_left_mask(res, shift, mask, bits=32): tmp = res for i in range(bits // shift): tmp = res ^ tmp << shift & mask return tmp
defextract_number(y): y = y ^ y >> 11 y = y ^ y << 7 & 2636928640 y = y ^ y << 15 & 4022730752 y = y ^ y >> 18 return y&0xffffffff
defrecover(y): y = inverse_right(y,18) y = inverse_left_mask(y,15,4022730752) y = inverse_left_mask(y,7,2636928640) y = inverse_right(y,11) return y&0xffffffff