Python爬蟲踩坑之隨機數種子的問題
阿新 • • 發佈:2018-12-20
在看一本資料庫產生了一個關於離散的問題,由於本人對離散還不懂。在大佬的建議下研究了下隨機數種子的問題(和此問題類似吧)
由於隨機數種子的概念有些文章已經有了就不在贅述:隨機數種子概述
在此主要通過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隨機的
期望大神的引導!!!!!!!!!!