相同随机种子下两种NumPy随机抽样方法结果不同原因咨询
相同随机种子下numpy抽样结果不一致的原因
核心原因非常直接:numpy的全局随机数生成器是按调用顺序逐次消耗固定随机数流的,两种写法的随机数取用顺序完全不同,哪怕种子一致,最终生成的抽样结果也会出现明显差异。
随机数生成的基本规则
当你调用np.random.seed(1)时,numpy会把全局随机数生成器重置为初始状态,生成一个位置固定、顺序固定的随机数序列。之后每调用一次随机数生成函数,就会从这个序列的当前位置开始,取对应数量的随机数做分布映射,用过的随机数不会被重复取用,位置指针会向后移动对应长度。
两种写法的取数逻辑差异
两种写法最终都消耗了40个随机数,但取用顺序完全不同:
- 方法1是「批量先抽x,再批量抽y」
对应代码:
第一行抽样会直接取序列里的前20个随机数,全部映射到[-10,10]的均匀区间生成x1数组,此时指针移动到第21个随机数的位置;第二行抽样接着取第21到40个随机数,全部映射到[20,80]区间生成y1数组。np.random.seed(1) x1 = np.random.uniform(low=-10, high=10, size=20) y1 = np.random.uniform(low=20, high=80, size=20) - 方法2是「逐点交替抽x和y」
对应代码:
循环每跑一轮,就先后调用两次单值抽样:先取1个随机数映射成当前点的x,再取下1个随机数映射成当前点的y。整个循环跑完,总共取了20轮,随机数的取用顺序是:第1个给第1个点的x、第2个给第1个点的y、第3个给第2个点的x、第4个给第2个点的y……直到第40个给第20个点的y。也就是说x坐标只用了序列里的所有奇数位随机数,y坐标用了所有偶数位随机数。N = 20 np.random.seed(1) points = [(np.random.uniform(-10,10), np.random.uniform(20,80)) for i in range(N)]
直观验证
你可以对比两边的输出:方法2第一个点的x值-1.6595599059485195和方法1x1数组的第一个值完全一致,这是因为两者对第一个随机数的使用方式完全相同。但从第二个随机数开始,用法就完全错位了:方法1拿第二个随机数继续生成x1的第二个元素,方法2拿第二个随机数生成第一个点的y值,后续所有随机数的使用场景全部错开,最终结果自然差异明显。
注:numpy批量抽样(传入size参数一次性生成多个值)和逐次单值抽样的底层映射算法完全一致,不存在批量生成导致的结果偏差,差异来源只有取数顺序的不同。
内容的提问来源于stack exchange,提问作者IceAloe
相关产品推荐
相关产品推荐

