问题一:np.random.RandomState 和 np.random.seed 有什么区别?
本质没区别,只是语法上的区别。
import numpy as np
rng = np.random.RandomState(0)
for i in range(3):
print(rng.randn(2))
print()
np.random.seed(0)
for i in range(3):
print(np.random.randn(2))
得到输出结果完全一样,证明两个方法完全一样,只是在语法上有所区别。
[1.76405235 0.40015721]
[0.97873798 2.2408932 ]
[ 1.86755799 -0.97727788]
[1.76405235 0.40015721]
[0.97873798 2.2408932 ]
[ 1.86755799 -0.97727788]
问题二:循环使用上述伪随机代码为什么会得到不同的结果?例如第一次循环得到
[1.76405235 0.40015721]
再次循环得到
[0.97873798 2.2408932 ]
这两个是完全不同的结果。不是说伪随机都会得到相同的结果吗?
后来我发现,无论是np.random.RandomState 还是 np.random.seed,使用过一次之后就需要重新再复述一遍才能得到一样的结果。也就是说要想得到每次循环里的结果一样,需要把随机种子的声明也写入循环里面。
for i in range(3):
rng = np.random.RandomState(0)
print(rng.randn(2))
print()
for i in range(3):
np.random.seed(0)
print(np.random.randn(2))
得到结果完全一样
[1.76405235 0.40015721]
[1.76405235 0.40015721]
[1.76405235 0.40015721]
[1.76405235 0.40015721]
[1.76405235 0.40015721]
[1.76405235 0.40015721]