目前我收到了一个python文件。它有以下代码(与服务器交互):
random.seed(time.time())
random.randint(0, 10000) // number 1, server gives me
random.randint(0, 10000) // number 2, server gives me
random.randint(0, 10000) // number 3, server gives me
random.randint(0, 10000) // <- this is the number I have to guess, server does not give to me
我想猜测正确的种子值以猜测数字链。但time.time()返回浮点数。那么random.seed将使用多少个数字?我知道如果种子值是一个整数会更容易,但现在这是一个浮点数,而且我被卡住了。
答案 0 :(得分:0)
编辑:我的逻辑关闭了... woops。答案仍然是一样的。 random.seed(time.time())
似乎使用time.time()
生成的舍入数字。
a = time.time() # say print(a) produces 1234567890.123456
b = 1234567890.123456
random.seed(a) # this will produce the same seed value as
random.seed(b) # this
答案 1 :(得分:0)
random.seed()函数接受一个可散列对象,并使用所述对象的散列作为其种子。 (例外是int
和long
,它们直接使用而不进行散列,请参阅下面的编辑。)如果您希望能够显式设置种子,那么您需要创建一个可以使用的哈希对象控制哈希。例如:
#!/usr/bin/env python3
import random
class HashMe(float):
'''
A test for a hashable that can have its hash set by brute force.
'''
def __init__(self, hash_val):
self.hash_val = hash_val
def __hash__(self):
return self.hash_val
a = HashMe(42)
print('HashMe(42) hashes to: ', a.__hash__())
print('\nSeed with a')
random.seed(a)
for _ in range(4):
print(random.randint(0, 10000))
print('\nReseed with random data...')
random.seed(random.random())
for _ in range(4):
print(random.randint(0, 10000))
print('\nSeed with a again - et voila!')
random.seed(a)
for _ in range(4):
print(random.randint(0, 10000))
产生预期的:
HashMe(42) hashes to: 42
Seed with a
1824
409
4506
4012
Reseed with random data...
9359
4313
6609
6598
Seed with a again - et voila!
1824
409
4506
4012
说了这么多,即使是糟糕的Python PRNG,周期的长度足够长,以至于你不可能根据猜测种子来破译序列。
编辑:当然,在把它放在一起后,我浏览了Python源代码,看看如果种子是int或long,它只是直接使用种子值,所以不需要hashable shuck和jive来绕过它。生活和学习。