1 回答

TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個贊
這實(shí)際上是一個有趣的問題。
首先,您可能會通過連續(xù)調(diào)用獲得相同的結(jié)果time.time(),但主要是由于精度。
In [36]: a=time.time(); b=time.time()
In [37]: b-a
Out[37]: 0.0
現(xiàn)在讓我們進(jìn)入問題:
由于初始種子的生成方式不同,它不會產(chǎn)生相同的輸出。如果您查看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.
因?yàn)闆]有參考,所以time.time()你不能假設(shè)它使用它。事實(shí)上,您可以查看CPython實(shí)現(xiàn)的源代碼(如果您了解 C)。如果需要的話,它有助于保證隨機(jī)種子的方法之一是:
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));
}
對不同時鐘和進(jìn)程 ID 進(jìn)行多次調(diào)用。沒有關(guān)于time.time(). 由于種子是如何生成的,兩個連續(xù)的種子幾乎不可能相同。
如果您希望某些東西產(chǎn)生相同的輸出,則需要以相同的方式播種。
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
不過,它不一定是數(shù)字。您可以使用許多不同的選項(xiàng)來播種。
希望上面提供的源代碼可以解決這個問題。
添加回答
舉報