Java,选择随机并插入

时间:2012-11-29 11:39:10

标签: java

好的,这个例子并不重要。我只是用它来把它放在上下文中。但基本上我想知道如何从数组/ arraylist中取一个随机值?

我尝试过使用此功能:int random = (int)input[Math.floor(Math.random() * input.length)]; 但它突出了潜在的精确度损失,即使我已经cast它。 我错了吗?

这个例子真的无关紧要,我接受了所有问题的答案。 最初我想看到一个正确的答案,没有我的影响,看看我是否在正确的轨道上。

1 个答案:

答案 0 :(得分:1)

这正是 bin packing problem 。它也是NP-Complete,因此没有已知的多项式解(and the general assumption is one does not exist, but it is not proven yet)。

如果您正在寻找近似算法或相对有效的exact algorithm

,那么问题就会被广泛研究

PS - 您建议的随机方法会为您提供解决方案,但它不会是最佳的。
反例:

arr = [2,3,4,1] , size=5

您的算法的可能解决方案可能是:select 3, select 1, select 4, select 2,它将产生:

[3,1],[4],[2]

虽然最佳解决方案是[3,2],[4,1]

( - )我相信一种贪婪的方法(选择最高的,把它放在一个可用的箱子里 - 如果它适合,如果不适合 - “打开”一个新箱子)会比随机解决方案更好但是会用反例来说仍然不是最优的:

arr = [5,4,4,3,2,2] size = 10

贪婪将产生[5,4],[4,3,2],[2],而最佳值为[5,3,2],[4,4,2]


关于精度损失 - 这是因为Math.floor(double)产生long,而您将其用作int(理论上可能会丢失数据)这样做的时候)。但是,这不是问题,因为Math.floor(Math.random() * input.length保证在int的范围内,因为input.length是一个整数和Math.random() < 1