From 95dd1e40b49cacddbf562eac6d2218170783e814 Mon Sep 17 00:00:00 2001 From: Shlomi Fish Date: Tue, 8 Nov 2016 16:08:31 +0200 Subject: [PATCH] Implement > 2e9 ms/FC-Pro deals. Larger than 2 milliard Freecell Pro deals in PySolFC - with a test. --- pysollib/pysolrandom.py | 31 ++++++++++++++++++++++++------- tests/board_gen/ms_deals1.py | 20 +++++++++++++++++--- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/pysollib/pysolrandom.py b/pysollib/pysolrandom.py index d674e44b..5ed98188 100644 --- a/pysollib/pysolrandom.py +++ b/pysollib/pysolrandom.py @@ -198,18 +198,35 @@ class LCRandom64(MFXRandom): # ************************************************************************ class LCRandom31(MFXRandom): - MAX_SEED = 0x7fffffffL # 31 bits + MAX_SEED = 0x1ffffffffL # 33 bits def str(self, seed): return "%05d" % int(seed) - def random(self): - self.seed = (self.seed*214013L + 2531011L) & self.MAX_SEED - return (self.seed >> 16) / 32768.0 + def setSeed(self, seed): + seed = long(seed) + self.seed = seed + if not (0L <= seed <= self.MAX_SEED): + raise ValueError, "seed out of range" + self.seedx = (seed if (seed < 0x100000000L) else (seed - 0x100000000L)) + return seed + + def _rando(self): + self.seedx = (self.seedx*214013 + 2531011) & self.MAX_SEED + return ((self.seedx >> 16) & 0x7fff) + + def _randp(self): + self.seedx = (self.seedx*214013 + 2531011) & self.MAX_SEED + return ((self.seedx >> 16) & 0xffff) def randint(self, a, b): - self.seed = (self.seed*214013L + 2531011L) & self.MAX_SEED - return a + (int(self.seed >> 16) % (b+1-a)) + if self.seed < 0x100000000: + ret = self._rando() + ret = (ret if (self.seed < 0x80000000) else (ret | 0x8000)) + else: + ret = self._randp() + 1 + + return a + (ret % (b+1-a)) def shuffle(self, seq): n = len(seq) - 1 @@ -234,7 +251,7 @@ def constructRandom(s): m = re.match(r"ms(\d+)\n?\Z", s); if m: seed = long(m.group(1)) - if 0 <= seed < (1 << 31): + if 0 <= seed <= LCRandom31.MAX_SEED: ret = LCRandom31(seed) ret.setSeedAsStr(s) return ret diff --git a/tests/board_gen/ms_deals1.py b/tests/board_gen/ms_deals1.py index 46a8b654..9e589f50 100644 --- a/tests/board_gen/ms_deals1.py +++ b/tests/board_gen/ms_deals1.py @@ -557,7 +557,7 @@ class Game: def shlomif_main(args): - plan(3) + plan(4) rand = constructRandom('24') game = Game("freecell", rand, True) @@ -607,7 +607,21 @@ KC JS 9H 4S 7S AD 'PySolFC deal No. 123456', ); + rand = constructRandom('ms3000000000') + game = Game("freecell", rand, True) + # TEST + got_s = game.print_layout() + ok (got_s == '''8D TS JS TD JH JD JC +4D QS TH AD 4S TC 3C +9H KH QH 4C 5C KD AS +9D 5D 8S 4H KS 6S 9S +6H 2S 7H 3D KC 2C +9C 7C QC 7S QD 7D +6C 3H 8H AC 6D 3S +8C AH 2H 5H 2D 5S +''', + 'Microsoft Deal #3E9 - long seed.', +); + if __name__ == "__main__": sys.exit(shlomif_main(sys.argv)) - -