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
不过,它不一定是数字。您可以使用许多不同的选项来播种。
希望上面提供的源代码可以解决这个问题。
添加回答
举报