【问题标题】:Generate two lists of random numbers to obtain a fixed sum生成两个随机数列表以获得固定和
【发布时间】:2021-12-27 18:24:43
【问题描述】:

我需要生成两个总和为特定数字的列表(我们称它们为 X 和 Y)。

我需要创建的函数将 X 和 Y 的长度以及总和作为输入。

然后它为 X 创建随机正数,为 Y 创建负数,并将它们归一化以求和为我想要的数字。

我试过这样做:

def extractAmount(ina, outa, balance):
    # ina: length of X, outa: length of Y, balance: the number I want
    valin = random.random((1, ina))  # X
    valout = -random.random((1, outa))  # Y
    val = np.concatenate([valin[0], valout[0]])
    valf = (np.round(val / abs(np.sum(val)) * abs(balance))).tolist() 
    return valf

该代码适用于正数和负数balance,如果balance == 0,我该如何改进它?

如果我做extractAmount(2, 3, 100),输出是[49.0, 350.0, -44.0, -68.0, -186.0],我的问题是如果我做extractAmount(2, 3, 0),它返回[0.0, 0.0, 0.0, 0.0, 0.0],而我需要它是随机值,而不是全零。

【问题讨论】:

  • 我对你真正想要的东西感到困惑。您说该函数采用每个列表的长度,但根据您的代码,ina 是正数的最大值,outa 是负数的最大值。
  • 您应该提供输入/输出示例
  • ina 和 outa 是我想要的 X 和 Y 的长度(在代码 valin 和 valout 中)。通过使用 random.random((1,3)) (如 ina=3),我在一个数组中获得了 3 个随机数,我错了吗?
  • @DuccioBorchi 您使用的是 Python 2 还是 3?随机模块对我来说不起作用。将元组传递给 random.random 会导致参数异常
  • Python 3 对我有用

标签: python numpy random


【解决方案1】:

我认为您还需要一个约束才能明确定义问题。例如,您可以要求 x 值具有一定的平均值,例如 200。然后您可以首先缩放随机 x 值以满足该要求,然后缩放随机 y 值以满足与 x 结合的平衡要求:

import numpy as np

def extract_amount(length_x, length_y, mean_x, balance):
    x = np.random.random(length_x)
    x *= mean_x / np.mean(x)
    y = np.random.random(length_y)
    mean_y = (np.sum(x) - balance) / length_y
    y *= - mean_y / np.mean(y)
    return x, y

# Example 1
extract_amount(2, 3, 200, 100)
(array([224.47381339, 175.52618661]),
 array([-101.83346151, -181.49633185,  -16.67020665]))
# Example 2
extract_amount(2, 3, 200, 0)
(array([268.78299914, 131.21700086]),
 array([ -80.71742313, -125.50531378, -193.77726309]))

【讨论】:

  • 这可能是一个解决方案,唯一的问题是我没有 x 或 y 的平均值,我想也许我可以生成一个数字,然后从第一个开始生成其他数字
  • 但是您仍然需要输入一个约束来生成第一个数字。如果您没有平均值,也许您可​​以证明 x 项的某个最大值并使用 np.random.randint 生成 x,而不进行缩放?
  • 是的,我确实喜欢它并且它有效,我使用了(random.random()*b_mean)/ina,其中ina 是x 的长度,b_mean 是所有余额的平均值(我之前将它们存储在字典中)。因此,如果您知道其中一个向量的可能均值,我认为这是一个很好的解决方案
猜你喜欢
  • 2018-09-14
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2017-07-27
相关资源
最近更新 更多