我有一个包含随机数的数组:
var EqualMe = [Math.random(), Math.random(), Math.random(),Math.random()];
现在我们可以说选择的数字是:0.4,0.3,0.2,0.1。我需要找到一种方法来制作一个算法,它将每个数字等于0.25(因为(0.4 + 0.3 + 0.2 + 0.1)/ 4 = 0.25)并且我试图以最快的方式通过< strong>从数组中的每个数字中取出一个值到另一个数字。
因此,对于这个例子,最短的方法是从EqualMe [0]中取出0.15到EqualMe [3]的值,并从EqualMe [1]中取出0.05到EqualMe [2],这样数组中的每个数字将是相同的(0.25)。
我的问题是如何创建一个代码,当数组的大小可以是任何给定的选择(不仅是4个数字)并且数组中的值完全是随机的时,可以找到提取值的最短方法,所以这些数字与可能的最低提款完全相等?
请注意: 我需要为比特币钱包的钱交换程序编码 每次我从一个钱包到另一个钱包里取钱,我都会收取费用 所以我需要从一个钱包到另一个钱包里取钱 尽可能提取最低金额,以便所有钱包在给予总金额时具有相同的价值
答案 0 :(得分:0)
修改: 我会找到一组数字的平均值,计算每个数字与该数字相比的差异,并按最大差异对它们进行排序,然后开始将这些值分成每个数值,使其等于平均值。因此,您将逐个匹配最大的差异(并将任何余数发送到NEXT项目中)
======
实施例1:0.4,0.3,0.45,0.25(平均值为0.35)
差异为0.1(0.25), - 0.1(0.45),0.05(0.3)和-0.05(0.4),只需要两笔交易即可获得0.35的所有值。
第一次交易 =从0.45,移动 - 0.1到0.25 = 0.35两个
第二次交易 =从0.4开始,两者都移动-.05到0.3 = 0.35
======
例2:
0.32,0.47,0.12,056(平均值= 0.3675)
差异(按顺序排序)0.2475(0.12), - 0.1925(0.56),0.1025(0.47),0.0475(0.32)
第一次交易 =从0.56,移动0.1925到0.12(现在等于0.3125)
第二次交易 =从0.47,移动0.0550到0.12(现在等于0.3675)
第三次交易 =从0.47,移动0.0475到0.32(现在等于0.3675左
你可能会使用MEDIAN值而不是某些情况下的平均值,但我可能会设置BOTH,测试哪一个使用最少的事务,然后提交事务最少的那个。
ORIGINAL
而不是以编程方式处理这个,为什么不以数学方式?
例如,如果您随机生成数字,则可以更改其值以获得所需的0.25。
如果你的4个随机值的总和等于1.4(0.4,0.3,0.45,0.25),你可以做0.25 / 1.4,这是~0.17,然后将你的每个值乘以0.17,将它们的值减少到总数0.25。
(0.4 x 0.17)+(0.3 x 0.17)+(0.45 x 0.17)+(0.25 x 0.17)= ~0.25