2016-04-14 15 views
3

現在、私はpythonファイルを受け取りました。私は数チェーンを推測するために、右のシード値を推測したい現在のタイムスタンプを使用して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

Pythonのソースコードを読んで、次の番号を調べることができます。 root/Lib/random.pyとroot/Modules/_randillaryule.cをお勧めします。 –

答えて

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 
+0

私はコンソールにtime.time()をタイプするだけで16桁の数字を生成するのかどうかはわかりません。次のように入力します:print "%.20f"%time.time()、小数点以下20桁を出力します。私はrandom.seedが停止する最後の番号がどこにあるのだろう... – dekhi

0

random.seed()関数はハッシュ可能なオブジェクトを受け取り、そのオブジェクトのハッシュをそのシードに使用します。 (例外はintlongで、ハッシングなしで直接使用されます。下記の編集を参照してください)。シードを明示的に設定できるようにするには、ハッシュを制御できるハッシュ可能オブジェクトを作成する必要があります。たとえば:

#!/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の場合はシード値を直接使用するので、ハッシュ可能なshuckとjiveを回避する必要はありません。生活し、学びます。

+0

あなたは何を意味するのか分かりません。しかし、私が種を知っていれば、同じナンバーチェーンを作ることができます。それは普通です:) – dekhi

+0

もちろんです。私が言っていたことは、あなたが種を知らなければ、宇宙の熱で死ぬ前に試行錯誤してPythonでそれを推測する確率は事実上ゼロであったということでした。 PRNGのソースを見ることで、シード上のヒントを得るために後ろ向きに作業することは可能かもしれませんが、依然としてかなり難しい作業です。 PythonのPRNGは暗号的には安全ですが、それは簡単ではありません。 –