随机数组生成器

时间:2013-04-28 11:24:28

标签: java arrays algorithm random

给定'n','m','k','x'和'y'整数值...
我有一个带有'n'位置的数字ArrayList,我需要使用第一个数组中的值和'm'位置创建'k'其他数组。我怎样才能确保数字之和为'x',最大误差范围为'y',并且数组之间尽可能不同?

我将在测试生成器中使用它来随机化问题。这些数字代表了难题。当我尝试这样做时,我随机化情况并检查它们是否正确,但这很慢。有人知道更好的方法吗?

3 个答案:

答案 0 :(得分:1)

根据您的描述,它听起来像离散背包问题的变体。基本上你搜索修改DKP的几个解决方案 - 如果有更多的k它们你可以删除其他的,如果更少 - 你可以置换你获得的那些以产生更多。

天真的实现将是从n = x-y到x + y搜索DKP的解,然后如上所述处理它们,但它可能非常慢。您可以在数学堆栈交换中获得一些更好的解决方案。

答案 1 :(得分:0)

您有一些不到n! / (m! . (n-m)!)个可接受的解决方案,其中可以选择最不同的解决方案。

  1. 可能的候选解决方案遵循偏离y的最佳平方成本。

  2. 对于固定数量的可能解决方案,选择最终解决方案 与先前接受的最终解决方案的差异很小:相同条目的难度总和。 (这只是局部最优,但应该这样做。)

  3. 在降低难度时对n#列表进行排序。 主要为n! / (m! . (n-m)!)迭代m#子列表。

    根据允许的范围更改候选人:跳过/失败超出范围。

答案 2 :(得分:0)

首先对你的数组进行排序。然后找到最接近我称之为中间的X / m的元素值。

找到最接近mid的m号。或者使用这个想法

因此设置源点等于mid:

  

for(int i = 0; i< n; i ++)

     

{a [i] = a [i] -mid}

现在您需要m个数字,这些数字的总和为零,请参阅link1& link2& link3可能有用。 为了更好的指导,请解释一下,你的意思是数组之间尽可能的不同。