1 回答

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
不過,它不一定是數字。您可以使用許多不同的選項來播種。
希望上面提供的源代碼可以解決這個問題。
添加回答
舉報