好的,这个例子并不重要。我只是用它来把它放在上下文中。但基本上我想知道如何从数组/ arraylist中取一个随机值?
我尝试过使用此功能:int random = (int)input[Math.floor(Math.random() * input.length)];
但它突出了潜在的精确度损失,即使我已经cast
它。
我错了吗?
这个例子真的无关紧要,我接受了所有问题的答案。 最初我想看到一个正确的答案,没有我的影响,看看我是否在正确的轨道上。
答案 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
。