Python生成和为指定值的两组随机数,解决balance为0时全零问题
问题原因分析
你现有代码在balance=0时返回全零,是因为归一化阶段乘了abs(balance)也就是0,所有值都会被置为0,需要单独对balance=0的场景做分支处理。
优化方案
针对balance=0的需求,核心是保证正数列表X的总和等于负数列表Y的绝对值总和,二者相加总合为0即可,不需要和原来一样全局归一化。同时保留原逻辑对非0balance的兼容性:
- 非0
balance场景沿用原有逻辑,仅修正原代码中random调用的小问题(原生random不支持传入形状参数,实际应为numpy的random方法) - 0
balance场景单独处理:先生成X、Y的随机值,分别归一化让X的总和等于任意正数值(可自定义量级)、Y的总和等于对应负数值,最终总合为0
优化后代码
import numpy as np def extractAmount(ina, outa, balance): # ina: length of X, outa: length of Y, balance: 目标总和 valin = np.random.random(ina) # 生成X的正随机值 valout = -np.random.random(outa) # 生成Y的负随机值 if balance != 0: # 非0目标总和沿用原有逻辑 val = np.concatenate([valin, valout]) valf = (np.round(val / abs(np.sum(val)) * abs(balance))).tolist() else: # 目标总和为0时单独处理,base参数可自由调整控制生成值的量级 base = 1000 # 归一化X,让X总和为base valin_norm = np.round(valin / valin.sum() * base) # 归一化Y,让Y总和为-base valout_norm = np.round(valout / valout.sum() * (-base)) valf = valin_norm.tolist() + valout_norm.tolist() return valf
效果测试
- 调用
extractAmount(2, 3, 100):输出和原逻辑一致,比如[47.0, 32.0, -16.0, -24.0, -39.0],总合为100 - 调用
extractAmount(2, 3, 0):输出非全零值,比如[621.0, 379.0, -452.0, -308.0, -240.0],总合为0,符合需求
内容的提问来源于stack exchange,提问作者Duccio Borchi
相关产品推荐
相关产品推荐

