随机性#

随机数生成器(RNG)通常用于生成、绘制和计算属性或操作网络。NetworkX提供使用两个标准RNG之一的功能:numpy的包 numpy.random 或者python的内置包 random . 它们都提供了生成数字的相同算法(Mersenne Twister)。它们的界面相似(危险地相似),但又不同。它们各自提供生成器的全局默认实例,由单个会话中的所有程序共享。在大多数情况下,您可以将RNG用作NetworkX设置的网络,这样您将得到合理的伪随机结果(统计上随机的结果,但以确定的方式创建的结果)。

有时您需要更多的控制如何生成数字。特别是,您需要设置 seed 使您的结果具有可复制性的生成器,无论是用于科学出版物还是用于调试。两个RNG包都有简单的函数,可以将种子设置为任意整数,从而确定随后生成的值。由于此软件包(以及许多其他软件包)同时使用两个RNG,您可能需要设置 seed 都是RNGs。即使我们严格地只使用其中一个RNG,您可能会发现自己使用的是另一个使用另一个RNG的包。设置两个全局RNG的状态就像将每个RNG的种子设置为任意整数一样简单:

>>> import random
>>> random.seed(246)        # or any integer
>>> import numpy
>>> numpy.random.seed(4812)

许多用户会对这一级别的控制感到满意。

对于需要更多控制的人,我们为使用RNG的函数提供了一个可选参数。此参数被调用 seed 但决定的不仅仅是RNG的种子。它告诉函数要使用哪个RNG包,以及是使用全局RNG还是本地RNG。

>>> from networkx import path_graph, random_layout
>>> G = path_graph(9)
>>> pos = random_layout(G, seed=None)  # use (either) global default RNG
>>> pos = random_layout(G, seed=42)  # local RNG just for this call
>>> pos = random_layout(G, seed=numpy.random)  # use numpy global RNG
>>> random_state = numpy.random.RandomState(42)
>>> pos = random_layout(G, seed=random_state)  # use/reuse your own RNG

每个使用RNG的networkx函数都是在编写时考虑了一个RNG包。它要么使用 randomnumpy.random 默认情况下。但有些用户只想对所有代码使用一个RNG。这个 seed 参数提供了一种机制,以便任何函数都可以使用 numpy.random RNG,即使函数是为 random . 其工作原理如下。

默认行为(当 seed=None )使用全局RNG作为函数的首选包。如果seed设置为整数值,则使用指定的seed值创建本地rng,并在该函数的持续时间内使用(包括对其他函数的任何调用),然后丢弃。或者,您可以指定 seed=numpy.random 以确保无论函数是否需要全局numpy rng。最后,您可以提供函数要使用的numpy rng。RNG随后可用于其他功能或甚至其他软件包,如sklearn。通过这种方式,您可以对项目中的所有随机数使用单个RNG。

虽然可以分配 seedrandom -为networkx函数编写的样式rng random 包API,numpy-rng接口有太多好的特性,我们无法确保 random -样式RNG适用于所有功能。实际上,你只能用 random RNGS(如果numpy不可用,则很有用)。但是,如果有numpy,你的经验会更丰富。

总之,您可以很容易地忽略 seed 讨论并使用全局RNG。您可以指定仅使用numpy全局RNG seed=numpy.random . 您可以通过提供整数种子值来使用本地RNG。你可以提供你自己的numpy-rng,为所有功能重用它。如果您想在计算中使用一个RNG,那么使用numpy-rngs更容易。