Numpy中randn与RandomState的区别及np.random.seed()的作用是什么
结论验证
你观察到的规律完全正确,本质是numpy伪随机数生成机制的体现:
- 直接调用
np.random.randn(n)时,使用的是numpy全局共享的默认随机数生成器实例。如果没有手动设置全局种子,该实例的初始种子会从系统随机熵源获取,且每次调用随机函数后内部状态会自动迭代更新,因此连续调用得到的采样结果均不相同。 - 每次执行
np.random.RandomState(n_clusters).randn(n)时,你都重新初始化了一个独立的随机数生成器实例,传入的n_clusters就是这个生成器的初始种子。伪随机数生成器的输出完全由初始种子决定,只要初始种子相同,生成的随机序列就是完全确定的,因此相同种子初始化后第一次调用randn的结果必然完全一致。
np.random.seed()的作用
该函数用于设置numpy全局默认随机数生成器的初始种子:
- 只要在所有随机函数调用前执行一次
np.random.seed(固定整数),后续所有np.random模块下的顶层随机函数(randn、randint、choice等)输出的随机序列就完全固定,可以复现。 - 示例效果如下:
import numpy as np np.random.seed(42) print(np.random.randn(2)) # 输出永远是 [ 0.49671415, -0.1382643 ] print(np.random.randn(2)) # 后续输出也固定不变
如果需要多组互不干扰的可复现随机流,更推荐单独创建多个RandomState实例(新版本numpy推荐使用np.random.default_rng(seed)),避免修改全局种子对其他代码模块的随机逻辑产生影响。
内容的提问来源于stack exchange,提问作者Mainland
相关产品推荐
相关产品推荐

