def do_test_state(self, mt): # States are the same except first part, which can not be recover self.assertListEqual(mt[1:], mt19937.untwist(mt19937.twist(mt))[1:], "test with state mt == untwist(twist(mt)), mt: {}".format(mt)) # mt[0] is not recoverable # if you twist untwisted state, also first part must be twisted correctly self.assertListEqual(mt19937.twist(mt), mt19937.twist(mt19937.untwist(mt19937.twist(mt))), "test with state twist(mt) == twist(untwist(twist(mt))), mt: {}".format(mt))
def test_uninit(self): testData = [42, 4190403025, 1303704821] + [random.getrandbits(32) for _ in range(10)] for seed in testData: # extract seed from initial state self.assertEqual(mt19937.uninit(mt19937.init(seed)), seed) # perform twist, then untwist and then extract seed self.assertEqual(mt19937.uninit(mt19937.untwist(mt19937.twist(mt19937.init(seed)))), seed) # if state is not initial None is returned self.assertIsNone(mt19937.uninit(mt19937.twist(mt19937.init(seed))))
def do_test_state(self, mt): # States are the same except first part, which can not be recover self.assertListEqual( mt[1:], mt19937.untwist(mt19937.twist(mt))[1:], "test with state mt == untwist(twist(mt)), mt: {}".format( mt)) # mt[0] is not recoverable # if you twist untwisted state, also first part must be twisted correctly self.assertListEqual( mt19937.twist(mt), mt19937.twist(mt19937.untwist(mt19937.twist(mt))), "test with state twist(mt) == twist(untwist(twist(mt))), mt: {}". format(mt))
def test_uninit(self): testData = [42, 4190403025, 1303704821 ] + [random.getrandbits(32) for _ in range(10)] for seed in testData: # extract seed from initial state self.assertEqual(mt19937.uninit(mt19937.init(seed)), seed) # perform twist, then untwist and then extract seed self.assertEqual( mt19937.uninit( mt19937.untwist(mt19937.twist(mt19937.init(seed)))), seed) # if state is not initial None is returned self.assertIsNone(mt19937.uninit(mt19937.twist( mt19937.init(seed))))
def test_untwist(self): # untwist state, that was created from seed by one run of twist for seed in [42, 4190403025, 1303704821] + [random.getrandbits(32) for _ in range(10)]: self.do_test_seed(seed) # untwist state, that was created from seed by two runs of twist for seed in [42, 4190403025, 1303704821] + [random.getrandbits(32) for _ in range(10)]: self.do_test_state(mt19937.twist(mt19937.twist(mt19937.init(seed)))) # untwist randomly generated state mt = [0] * 624 for _ in range(10): for i in range(624): mt[i] = random.getrandbits(32) self.do_test_state(mt)
def test_random_numbers_big(self): for i in range(624*self.rounds): if i % 624 == 0: self.mt = mt19937.twist(self.mt) np_r = struct.unpack("<L", self.rn.bytes(4))[0] mt_r = mt19937.extract_number(self.mt, i % 624) self.assertEqual(np_r, mt_r, "[ERROR]: seed={}, twist={}, i={}".format(self.seed, i // 624, i))
def test_untwist(self): # untwist state, that was created from seed by one run of twist for seed in [42, 4190403025, 1303704821 ] + [random.getrandbits(32) for _ in range(10)]: self.do_test_seed(seed) # untwist state, that was created from seed by two runs of twist for seed in [42, 4190403025, 1303704821 ] + [random.getrandbits(32) for _ in range(10)]: self.do_test_state(mt19937.twist(mt19937.twist( mt19937.init(seed)))) # untwist randomly generated state mt = [0] * 624 for _ in range(10): for i in range(624): mt[i] = random.getrandbits(32) self.do_test_state(mt)
def test_random_numbers_big(self): for i in range(624 * self.rounds): if i % 624 == 0: self.mt = mt19937.twist(self.mt) np_r = struct.unpack("<L", self.rn.bytes(4))[0] mt_r = mt19937.extract_number(self.mt, i % 624) self.assertEqual( np_r, mt_r, "[ERROR]: seed={}, twist={}, i={}".format( self.seed, i // 624, i))
def test_is_init(self): testData = [42, 4190403025, 1303704821] + [random.getrandbits(32) for _ in range(10)] # function init generates initial state for seed in testData: self.assertTrue(mt19937.is_init(mt19937.init(seed))) # function twist generates state, that is not init for seed in testData: self.assertFalse(mt19937.is_init(mt19937.twist(mt19937.init(seed)))) # function untwist applied on one time twisted state generates initial state for seed in testData: self.assertTrue(mt19937.is_init(mt19937.untwist(mt19937.twist(mt19937.init(seed))))) # two times applied function twist and untwist is not working because I am loosing information from mt[0] for seed in testData: mt = mt19937.init(seed) mt = mt19937.twist(mt) mt = mt19937.twist(mt) mt = mt19937.untwist(mt) mt = mt19937.untwist(mt)
def check(self, pg, mt, rounds): ret = True for i in range(624*rounds): if i % 624 == 0: mt = mt19937.twist(mt) pg_r = pg.getNumber() mt_r = mt19937.extract_number(mt, i % 624) if pg_r != mt_r: print("[ERROR] round {} wrong prediction: pg_r= {}, mt_r= {}".format(i, pg_r, mt_r)) ret = False return ret
def check(self, pg, mt, rounds): ret = True for i in range(624 * rounds): if i % 624 == 0: mt = mt19937.twist(mt) pg_r = pg.getNumber() mt_r = mt19937.extract_number(mt, i % 624) if pg_r != mt_r: print("[ERROR] round {} wrong prediction: pg_r= {}, mt_r= {}". format(i, pg_r, mt_r)) ret = False return ret
def test_is_init(self): testData = [42, 4190403025, 1303704821 ] + [random.getrandbits(32) for _ in range(10)] # function init generates initial state for seed in testData: self.assertTrue(mt19937.is_init(mt19937.init(seed))) # function twist generates state, that is not init for seed in testData: self.assertFalse(mt19937.is_init(mt19937.twist( mt19937.init(seed)))) # function untwist applied on one time twisted state generates initial state for seed in testData: self.assertTrue( mt19937.is_init( mt19937.untwist(mt19937.twist(mt19937.init(seed))))) # two times applied function twist and untwist is not working because I am loosing information from mt[0] for seed in testData: mt = mt19937.init(seed) mt = mt19937.twist(mt) mt = mt19937.twist(mt) mt = mt19937.untwist(mt) mt = mt19937.untwist(mt)
def setUp(self): self.rn = np.random.RandomState(42) self.mt = [0] * 624 self.mt = mt19937.init(42) self.mt = mt19937.twist(self.mt)
def createState(self, seed): mt = mt19937.init(seed) mt = mt19937.twist(mt) return mt