File: random_base.py

package info (click to toggle)
python-pysol-cards 0.16.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 272 kB
  • sloc: python: 833; makefile: 5
file content (87 lines) | stat: -rw-r--r-- 2,176 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# vim:fenc=utf-8
#
# Copyright © 2019 Shlomi Fish <shlomif@cpan.org>
#
# Distributed under terms of the MIT license.

from pysol_cards.errors import SubclassResponsibility


class RandomBase(object):
    DEALS_PYSOL = 0
    DEALS_PYSOLFC = 1
    DEALS_MS = 2

    MAX_SEED = 10 ** 20
    ORIGIN_UNKNOWN = 0
    ORIGIN_RANDOM = 1
    ORIGIN_PREVIEW = 2
    ORIGIN_SELECTED = 3
    ORIGIN_NEXT_GAME = 4

    def __init__(self, seed=None):
        """docstring for __init__"""
        self.seed_as_string = None

    def shuffle(self, seq):
        for n in range(len(seq) - 1, 0, -1):
            j = self.randint(0, n)
            seq[n], seq[j] = seq[j], seq[n]
        return seq

    def randint(self, a, b):
        """ Get a random integer in the range [a, b] including both ends."""
        return a + int(self.random() * (b + 1 - a))

    def randrange(self, a, b):
        """ Get a random integer in the range [a, b) excluding b."""
        return self.randint(a, b - 1)

    def choice(self, sequence):
        """ Pick a random element of sequence """
        return sequence[self.randrange(0, len(sequence))]

    def setSeedAsStr(self, new_s):
        self.seed_as_string = new_s

    def getSeedAsStr(self):
        if self.seed_as_string:
            return self.seed_as_string
        return str(self)

    def getSeedStr(self):
        return str(self.initial_seed)

    def __str__(self):
        return self.str(self.initial_seed)

    def str(self, seed):
        return '%020d' % (seed)

    def increaseSeed(self, seed):
        if seed < self.MAX_SEED:
            return seed + 1
        return 0

    def copy(self):
        ret = self.__class__()
        ret.__dict__.update(self.__dict__)
        return ret

    def reset(self):
        raise SubclassResponsibility

    def _getRandomSeed(self):
        import time
        ret = int(time.time() * 256.0)
        return ((ret ^ (ret >> 24)) % (self.MAX_SEED + 1))

    def getstate(self):
        """getstate() for PySolFC"""
        return self.seed

    def setstate(self, new_state):
        """set to a new state"""
        self.seed = new_state