1. 程式人生 > >Python爬蟲踩坑之隨機數種子的問題

Python爬蟲踩坑之隨機數種子的問題

在看一本資料庫產生了一個關於離散的問題,由於本人對離散還不懂。在大佬的建議下研究了下隨機數種子的問題(和此問題類似吧) 書籍資訊

由於隨機數種子的概念有些文章已經有了就不在贅述:隨機數種子概述

在此主要通過Python當中random來研究這個問題:random模組 進入模組原始碼:比較看重翻譯的同學請忍耐

    def seed(self, a=None, version=2):
        """
        從可雜湊物件中初始化內部狀態。
        沒有或沒有爭論種子從當前時間或從作業系統特定的隨機性來源,如果可用的話。
        如果*a*是int,則使用所有位。##預設	None,可以傳int
        
        對於版本2(預設值),如果a是STR,則使用所有的位。位元組,或位元組碼。版本1(隨機重放)從舊版本的Python序列,STR的演算法和位元組產生較窄範圍的種子。##這是一個版本的 問題,老版本是因為以前字串位元組短,這裡是官方處理相容

        """
		#如果為None走os模組的urandom()中產生,urandom()涉及一個版本相容的問題(3.6)如果相容除了問題就走time.time,下面介紹吧
        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
		#演算法來了,預設是2
        if version == 1 and isinstance(a, (str, bytes)):
            x = ord(a[0]) << 7 if a else 0
            for c in a:
                x = ((1000003 * x) ^ ord(c)) & 0xFFFFFFFFFFFFFFFF
            x ^= len(a)
            a = -2 if x == -1 else x
       #如果傳入的a是字串,就會編譯轉一個整數在傳進seed
        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

那麼此函式最後不論傳入 None還是字串都是轉成int值回撥。是沒有返回值的說了半天還是沒有意義嗎?再來看隨機產生的random.random()

昨天翻了原始碼和一些資料,雖然瞭解了一些隨機數種子的演算法:演算法引用 但是並未查到Python當中seed是使用的何種演算法來影響random隨機的

期望大神的引導!!!!!!!!!!