Ejemplo n.º 1
0
 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))
Ejemplo n.º 2
0
 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))))
Ejemplo n.º 3
0
 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))
Ejemplo n.º 4
0
 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))))
Ejemplo n.º 5
0
    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)
Ejemplo n.º 6
0
 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))
Ejemplo n.º 7
0
    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)
Ejemplo n.º 8
0
 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))
Ejemplo n.º 9
0
 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)
Ejemplo n.º 10
0
 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
Ejemplo n.º 11
0
 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
Ejemplo n.º 12
0
 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)
Ejemplo n.º 13
0
    def setUp(self):
        self.rn = np.random.RandomState(42)

        self.mt = [0] * 624
        self.mt = mt19937.init(42)
        self.mt = mt19937.twist(self.mt)
Ejemplo n.º 14
0
 def createState(self, seed):
     mt = mt19937.init(seed)
     mt = mt19937.twist(mt)
     return mt
Ejemplo n.º 15
0
 def createState(self, seed):
     mt = mt19937.init(seed)
     mt = mt19937.twist(mt)
     return mt
Ejemplo n.º 16
0
    def setUp(self):
        self.rn = np.random.RandomState(42)

        self.mt = [0] * 624
        self.mt = mt19937.init(42)
        self.mt = mt19937.twist(self.mt)