我有一个任务:给定值N。我应该生成一个长度为L> 1的列表,以使其元素的平方和等于N。
我写了一个代码:
deltas = np.zeros(L)
deltas[0] = (np.random.uniform(-N, N))
i = 1
while i < L and np.sum(np.array(deltas)**2) < N**2:
deltas[i] = (np.random.uniform(-np.sqrt(N**2 - np.sum(np.array(deltas)**2)),\
np.sqrt(N**2 - np.sum(np.array(deltas)**2))))
i += 1
但是,如果我多次生成这样的列表,这种方法将花费很长时间。 (我认为是因为循环)。
请注意,我不希望我的列表仅包含一个唯一值。值的分布不必统一-我仅以统一为例。
您能建议更快的方法吗? lib中可能有特殊功能吗?
答案 0 :(得分:0)
如果您不介意几个重复的1,则可以执行以下操作:
def square_list(integer):
components = []
total = 0
remaining = integer
while total != integer:
component = int(remaining ** 0.5)
remaining -= component ** 2
components.append(component)
total = sum([x ** 2 for x in components])
return components
此代码的工作原理是找到最大的平方,然后减小到下一个最大的平方。一直持续到最大的正方形为1为止,否则可能会导致列表中的3个1s。
如果您正在寻找更随机的分布,则在减去之前将剩余的随机变量作为单独的变量进行随机转换可能是有意义的。
IE:
value = transformation(remaining)
component = int(value ** 0.5)
这应该为您提供更多的“随机”值。