PyTorch生成和为0的随机整数原理及Numpy对应实现咨询
问题解答
一、PyTorch代码为啥能得到总和为0的结果
说白了,这就是个巧合,不是通用的生成总和为0随机数的方法:
torch.randint(-8,9,(50,1),dtype=torch.float)是生成-8到8之间的随机整数(因为randint的上限是开区间,实际取不到9),再转成float类型。- 你设置了种子
71,随机数生成器的输出就固定死了,刚好这次生成的50个数加起来凑成了0。要是换个种子(比如改成72),或者把生成数量改成49,总和基本就不是0了。这段代码本身根本没做任何保证总和为0的逻辑。
二、Numpy怎么生成总和为0的随机整数数组
要靠谱生成总和为0的数组,不能碰运气,得主动调整数值,给你两种实用方法:
方法1:生成后补全最后一个数
先搞n-1个随机整数,最后一个数直接设成前面所有数总和的相反数,保证整体加起来是0:
import numpy as np # 设置随机种子确保结果可复现 np.random.seed(71) count = 50 # 先生成49个[-8,8]的随机整数 arr = np.random.randint(-8, 9, size=count-1) # 补上最后一个数,让总和归0 arr = np.append(arr, -arr.sum()) # 验证一下 print(arr.sum()) # 输出肯定是0
方法2:生成对称数组(适合偶数长度)
生成一半数量的随机数,再拼上它们的相反数,打乱顺序就行,天然总和为0:
import numpy as np np.random.seed(71) count = 50 # 生成25个[-8,8]的随机整数 half_arr = np.random.randint(-8, 9, size=count//2) # 拼上相反数,再打乱顺序 arr = np.concatenate([half_arr, -half_arr]) np.random.shuffle(arr) print(arr.sum()) # 输出0
内容的提问来源于stack exchange,提问作者Hamed Zeinalzadeh
相关产品推荐
相关产品推荐

