Mercurial > p > roundup > code
comparison roundup/anypy/random_.py @ 5488:52cb53eedf77
reworked random number use
prefer secrets module from Python 3.6+, random.SystemRandom and finally plain random
| author | Christof Meerwald <cmeerw@cmeerw.org> |
|---|---|
| date | Sat, 04 Aug 2018 22:40:16 +0100 |
| parents | |
| children | adf54478cdaf |
comparison
equal
deleted
inserted
replaced
| 5487:ce171c81d823 | 5488:52cb53eedf77 |
|---|---|
| 1 try: | |
| 2 from secrets import choice, randbelow, token_bytes | |
| 3 def seed(v = None): | |
| 4 pass | |
| 5 | |
| 6 is_weak = False | |
| 7 except ImportError: | |
| 8 import os as _os | |
| 9 import random as _random | |
| 10 | |
| 11 # prefer to use SystemRandom if it is available | |
| 12 if hasattr(_random, 'SystemRandom'): | |
| 13 def seed(v = None): | |
| 14 pass | |
| 15 | |
| 16 _r = _random.SystemRandom() | |
| 17 is_weak = False | |
| 18 else: | |
| 19 # don't completely throw away the existing state, but add some | |
| 20 # more random state to the existing state | |
| 21 def seed(v = None): | |
| 22 import os, time | |
| 23 _r.seed((_r.getstate(), | |
| 24 v, | |
| 25 hasattr(os, 'getpid') and os.getpid(), | |
| 26 time.time())) | |
| 27 | |
| 28 # create our own instance so we don't mess with the global | |
| 29 # random number generator | |
| 30 _r = _random.Random() | |
| 31 seed() | |
| 32 is_weak = True | |
| 33 | |
| 34 choice = _r.choice | |
| 35 | |
| 36 def randbelow(i): | |
| 37 return _r.randint(0, i - 1) | |
| 38 | |
| 39 if hasattr(_os, 'urandom'): | |
| 40 def token_bytes(l): | |
| 41 return _os.urandom(l) | |
| 42 else: | |
| 43 def token_bytes(l): | |
| 44 _bchr = chr if str == bytes else lambda x: bytes((x,)) | |
| 45 return b''.join([_bchr(_r.getrandbits(8)) for i in range(l)]) |
