是的,它们在统计上是等效的。只要您为相同的正态分布生成数字,它们就会具有相同的统计特征。也就是说,均值和标准差应该非常接近它们所来自的分布。例如,
import numpy as np
mu, sigma = 2.0, 0.5
# A and B will have different seeds and so different numbers
A = np.random.normal(mu, sigma, size=(1000, 1000))
B = np.random.normal(mu, sigma, size=(1000, 1000))
# But their statistical characteristics should be similar enough
print(mu, np.mean(A), np.mean(B))
print(sigma, np.std(A), np.std(B))
从同一个种子开始生成的随机数总是相同的,当然假设我们使用相同的函数,我们在这种情况下就是这样做的。因此,这意味着您的两个数组将包含相同的元素,但顺序不同。我们可以通过一个适合我们屏幕的足够小的示例来观察这一点。
size = (3, 5)
def method1():
np.random.seed(123)
return np.random.normal(0, 1, size)
def method2():
np.random.seed(123)
x = np.zeros(size, dtype=float)
for i in range(size[1]):
x[:,i] = np.random.normal(0, 1, size[0])
return x
输出
# method 1
array([[-1.0856306 , 0.99734545, 0.2829785 , -1.50629471, -0.57860025],
[ 1.65143654, -2.42667924, -0.42891263, 1.26593626, -0.8667404 ],
[-0.67888615, -0.09470897, 1.49138963, -0.638902 , -0.44398196]])
#method 2
array([[-1.0856306 , -1.50629471, -2.42667924, -0.8667404 , 1.49138963],
[ 0.99734545, -0.57860025, -0.42891263, -0.67888615, -0.638902 ],
[ 0.2829785 , 1.65143654, 1.26593626, -0.09470897, -0.44398196]])
两种方法都生成相同的 3*5 数字。但是,第一种方法将前 5 个放在第一行,接下来的 5 个放在第二行,依此类推。而第二种方法将前 3 个放在第一列,接下来的 3 个放在第二列,依此类推。事实上,如果method2() 被重写为以下内容,它会以与method1() 相同的方式(逐行)放置数字。
# same result as `method1()`
def method3():
np.random.seed(123)
x = np.zeros(size, dtype=float)
for i in range(size[0]):
x[i,:] = np.random.normal(0, 1, size[1])
return x
不用说,如果每种方法生成相同的数字但顺序不同,那么两者之间的每一行/列的统计特征将不一样(因为它们具有不同的数字)。但是,如果每一行/列的样本足够大,即大小,它们应该服从它们所来自的分布的统计特征。
编辑:采样独立性
从documentation 可以看出,numpy 实现了 Mersenne Twister 算法 (MT)。它创建一个容器,所有其他发行版都使用该容器,例如normal()、exponential() 等。
MT 是一种广泛使用的 PRNG,已被广泛研究。任何物超所值的 PRNG 都将在一系列测试算法统计特性的测试中表现良好。阅读Diehard tests 和TestU01。在这些页面上搜索关键字 normal 和 uniform(即独立)以了解特定测试。
您还可以阅读this post,了解真正随机数生成器的理论方法。
归根结底,我们使用的生成器,我们之所以使用它们是因为它们被认为足够好可以满足我们的需求。如果您担心 MT 无法解决您的问题,您可能想要选择(并且可能实施)不同的东西。但是,如果不知道您要做什么,就不可能给出更可靠的建议。