簡體   English   中英

Python種子數

[英]Python number of rng seeds

在用於從種子初始化隨機數的文檔(python 3.5)中:

random.seed(a =無,版本= 2)

初始化隨機數生成器。

如果省略a或無,則使用當前系統時間。 如果操作系統提供了隨機性源,那么將使用它們而不是系統時間(有關可用性的詳細信息,請參見os.urandom()函數)。

如果a是一個int,則直接使用它。

使用版本2(默認值)時,str,bytes或bytearray對象將轉換為int並使用其所有位。 在版本1中,使用a的hash()代替。

尚不清楚有多少種子。 一個int通常只有40億個不同的值,但是python包含任意精度:

x = 1
type(x) # <class 'int'>
y = 123456789123456789123456789123456789123456789123456789123456789123456789
type(y) # <class 'int'>
z = x+y
z-y # 1 (no rounding error for a 71 digit number)

他們說所有的位都被使用了,但這可能意味着這些位被用來做一個通常為32位int的摘要。 為什么這么重要? 我需要從種子制作隨機圖案。 反過來,我需要制作隨機的圖案序列(該序列又有種子)。 一串隨機數生成器將受到“生日攻擊”,在這種情況下,大約只有十萬位左右,如果經過十萬左右,幾乎肯定會重復。 盡管這不是用於密碼學的,但這仍然是不可取的。

開源的最大好處是能夠簡單地查看帶有問題的代碼。 這是random.seed來源

if a is None:
    try:
        # Seed with enough bytes to span the 19937 bit
        # state space for the Mersenne Twister
        a = int.from_bytes(_urandom(2500), 'big')
    except NotImplementedError:
        import time
        a = int(time.time() * 256) # use fractional seconds

if version == 2:
    if isinstance(a, (str, bytes, bytearray)):
        if isinstance(a, str):
            a = a.encode()
        a += _sha512(a).digest()
        a = int.from_bytes(a, 'big')

super().seed(a)
self.gauss_next = None

你可以看到,如果version == 2str / bytes被提供,它需要的SHA512 a ,追加它,並且使用int.from_bytes ,產生一個非常大的int和至少保證一個512位的種子,甚至具有非常小自定義輸入。

如下所述,最終結果是保證種子的長度至少為624位。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM