【发布时间】:2014-09-26 09:52:18
【问题描述】:
我正在尝试随机生成一个范围在 -10^7 到 10^7 之间的整数数组,以便存在一个总和为零的子数组。
例如:7 6 4 8 -4 -8
1
我可以使用蛮力来做到这一点,但这需要很多时间,因为我必须生成非常大的此类数组。有没有使用 python 或 c++ 实现这一点的有效方法?
编辑:实际上我想生成很多具有不同场景的此类数组。我正在生成这些数组作为一个问题的测试用例,以确定任何给定的正整数和负整数数组是否包含一个总和为零的子数组。
尝试暴力破解代码:
import random
N = random.randint(10,100)
mylist = []
for i in xrange(1,N):
mylist.append(random.randint(-100,100))
list2 = [1,-1]
mylist = mylist[1:N-2] + list2 + mylist[N-2:N]
print mylist
所以我不得不手动调整很多。
谢谢!
【问题讨论】:
-
一个快速的技巧是确保您包含一个零作为元素之一并随机生成所有其他元素。那么你总是保证有一个大小为 1 且总和为零的子数组。
-
生成一个随机数组,然后选择一个随机子集。将其总和的负数添加到您的数组中。不知道这是什么分布。只是一个建议。
-
所以拿一个小数字的列表然后做'(x * 1941212119) % 123123457'或者类似的东西?
-
您可以生成任何带有随机数的数组,计算它们的总和(如果有0,继续,如果没有,添加相应的所需元素以确保总和为0,例如:如果它生成1 2 -5,你需要加2才能得到总和0),并再次生成随机元素放在开头和结尾,直到达到预期的大小。
-
@gmfreak 我不认为你上面给出的代码归类为“蛮力”。事实上,这与在某处插入一个零没有什么不同。真正的蛮力是随机生成所有元素,然后检查是否存在总和为零的子数组,如果不存在,则冲洗并重复。
标签: python c++ arrays algorithm