在Python3中,random.Random(seed)允许使用bytearray作为种子进行初始化。
class Random(_random.Random):
...
def __init__(self, x=None):
self.seed(x)
...
def seed(self, a=None, version=2):
...
if version == 2 and isinstance(a, (str, bytes, bytearray)):
if isinstance(a, str):
a = a.encode()
a += _sha512(a).digest()
a = int.from_bytes(a, 'big')
...
当你尝试时
>>> random.Random().__init__(bytearray([1, 2, 3]))
或者
>>> r = random.Random()
>>> r.seed(bytearray([1, 2, 3]))
它应该可以正常工作。
但是当你尝试这样做时,结果是不一致的。
>>> random.Random(bytearray([1, 2, 3]))
TypeError: unhashable type: 'bytearray'
我编译和调试了Python 3.7.0二进制文件,当我尝试使用一个bytearray初始化PRNG时,在Modules/_randommodule.c中会调用random_seed
方法并直接在此处引发类型错误。为什么?
r
的实例。在最后一个示例中,您不需要这样做。 - Aaron_abrandom.Random(x=bytearray([1,2,3]))
可以正常运行。(Python 3.6.7,Linux系统,我使用random.Random(bytearray([1,2,3]))
也得到了和你一样的错误。)这很奇怪。 - Gilles 'SO- stop being evil'bytearray
被视为bytes
。因此请尝试使用bytes
。random.Random(bytes(bytearray([1, 2, 3])))
- I_Al-thamaryrandom.seed(bytearray([1, 2, 3]))
print(random.random());
- I_Al-thamary