2016-04-14 28 views
3

Şu anda bir python dosyası aldım. O (bir sunucu ile etkileşim) kodu aşağıdaki etti:Geçerli zaman damgasını kullanarak python rastgele tohumunu tahmin edin

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 

Ben sayı zincirini tahmin etmek için doğru tohum değerini tahmin etmek istiyorum. Ancak time.time(), kayan nokta sayısını döndürür. Peki rastgele o noktadan sonra kaç sayı kullanacak? Tohum değerinin bir tamsayı olması çok daha kolay olacağını biliyorum, ama şimdi bu bir kayan nokta sayısı ve sıkışıp kaldım.

+0

Bir sonraki numarayı bulmak için Python kaynak kodunu okuyabilirsiniz. Kök/Lib/random.py ve root/Modules/_randommodule.c'yi öneririm –

cevap

0

Düzenleme: mantığım kapalıydı ... woops. Cevap hala aynı. random.seed(time.time()), time.time() tarafından üretilen yuvarlak sayıyı kullanıyor gibi görünüyor.

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

Sadece 16 basamak ürettiğinden emin değilim, çünkü bizde time.time() 'a yazıyoruz. Eğer yazarsanız: "% .20f"% time.time() yazdı, ondalık noktadan sonra 20 basamak basacaktır. Random.seed'in son sayısının nerede duracağını merak ediyorum ... – dekhi

0

random.seed() işlevi, bir hashable nesne alır ve tohum için bahsedilen nesnenin karma kullanır. (Bir istisna, karma olmadan doğrudan kullanılanve long'dur. Aşağıdaki düzenlemeye bakın.) Eğer tohumu açıkça ayarlayabilmeniz için, hash'ı kontrol edebileceğiniz yıkanabilir bir nesne oluşturmanız gerekir. Örneğin:

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 

Tüm bu having, hatta berbat Python PRNG üzerinde döngüsünün uzunluğu Hiç dayalı bir diziyi deşifre etmek olası değildir yeterince uzun:

#!/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)) 

beklenen üretir tohumun tahmin edilmesi üzerine.

Düzenleme: Tabii ki bunu bir araya getirdikten sonra Python kaynağına göz attım ve tohumun int veya uzun olması durumunda, tohum değerini doğrudan kullandığını görüyorum, bu yüzden atlatmak için yıkanabilir bir shuck ve jive gerek yoktu. . Yaşa ve öğren.

+0

Ne demek istediğini anlamadım. Ama eğer tohumu bilebilirsem, aynı sayı zincirini üretebilirim. Bu normal :) – dekhi

+0

Elbette öyle. Söylediğim şey, eğer tohumu bilmiyorsanız, evrenin ısı-ölümünden önce deneme ve yanılma yoluyla Python'da tahmin etme olasılığınız neredeyse sıfırdır. PRNG kaynağına bakarak tohum üzerinde bazı ipuçları almak için geriye doğru çalışabilirsiniz, ancak yine de oldukça göz korkutucu bir görevdir. Python'daki PRNG kriptografik olarak güvenli bir şeydir, ancak önemsiz olmaktan uzaktır. –