亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python 中的隨機函數預測

Python 中的隨機函數預測

HUH函數 2023-12-12 15:41:16
根據Random庫的文檔,假設開發人員沒有提供任何種子(None),該函數使用系統當前時間作為種子(time.time())。不幸的是,輸出似乎沒有反映文檔print(random.randrange(1,10)) a=time.time() . . . . random.seed(a)print(random.randrange(1,10))上面的代碼產生 2 個不同的輸出,因此假設我使用 Windows 10(對于那些可能會考慮 urandom 供應商方向的人)和 Python 3,我的問題是:1.為什么上面的代碼沒有產生相同的輸出2.如何讓它產生相同的輸出3.當我試圖在 Random.py 中找到種子分配部分時,我找不到任何 time.time() 分配給 Random.seed 的地方,所以如果有人可以參考該部分,我將不勝感激
查看完整描述

1 回答

?
慕桂英3389331

TA貢獻2036條經驗 獲得超8個贊

這實際上是一個有趣的問題。


首先,您可能會通過連續調用獲得相同的結果time.time(),但主要是由于精度。


In [36]: a=time.time(); b=time.time()


In [37]: b-a

Out[37]: 0.0

現在讓我們進入問題:


由于初始種子的生成方式不同,它不會產生相同的輸出。如果您查看random.py源代碼,seed()您會看到它指定

def seed(self, a=None, version=2):

   """Initialize internal state from a seed.

   The only supported seed types are None, int, float,

   str, bytes, and bytearray.

   None or no argument seeds from current time or from an operating

   system specific randomness source if available.

因為沒有參考,所以time.time()你不能假設它使用它。事實上,您可以查看CPython實現的源代碼(如果您了解 C)。如果需要的話,它有助于保證隨機種子的方法之一是:


static void

random_seed_time_pid(RandomObject *self)

{

    _PyTime_t now;

    uint32_t key[5];


    now = _PyTime_GetSystemClock();

    key[0] = (uint32_t)(now & 0xffffffffU);

    key[1] = (uint32_t)(now >> 32);


    key[2] = (uint32_t)getpid();


    now = _PyTime_GetMonotonicClock();

    key[3] = (uint32_t)(now & 0xffffffffU);

    key[4] = (uint32_t)(now >> 32);


    init_by_array(self, key, Py_ARRAY_LENGTH(key));

}

對不同時鐘和進程 ID 進行多次調用。沒有關于time.time(). 由于種子是如何生成的,兩個連續的種子幾乎不可能相同。


如果您希望某些東西產生相同的輸出,則需要以相同的方式播種。

In [42]: import random


In [43]: a = time.time()


In [44]: random.seed(a)


In [45]: random.randrange(100)

Out[45]: 98


In [46]: random.randrange(100)

Out[46]: 94


In [47]: random.seed(a)  # Reset


In [48]: random.randrange(100)

Out[48]: 98

不過,它不一定是數字。您可以使用許多不同的選項來播種。


希望上面提供的源代碼可以解決這個問題。


查看完整回答
反對 回復 2023-12-12
  • 1 回答
  • 0 關注
  • 174 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號