获得动态配给分配奖java

时间:2018-01-03 17:44:43

标签: java algorithm math statistics game-engine

我有这个算法有效,但我想把它改成动态比率,以使第一个位置的值的距离高于最新位置的值。

例如,如果奖金= 1000,total_prizes = 5,last_prize = 50,我得到了:

1) 350.00
2) 275.00
3) 200.00
4) 125.00
5) 50.00
TOTAL SUM: 1000.00

我希望看到的是:

1) 475.00
2) 250.00
3) 150.00
4) 75.00 
5) 50.00
TOTAL SUM: 1000.00

而不是在位置之间总是固定值为75.在这种情况下,增加距离接近第一个位置      从5)到4)25      从4)到3)75      从3)到2)100      从2)到1)225

这是当前的代码:

public static void main(String[] aa){
        float ratio;
        float first_prize;
        float s=0;
        float money = 1000;
        int total_prizes = 5;
        float last_prize = 50;
        float prizes[] = new float[total_prizes+1];

        first_prize=2*(money/total_prizes)-last_prize; //last member of the progresion

        ratio=(first_prize-last_prize)/(total_prizes-1);

        prizes[total_prizes]=last_prize;

        for (int j = total_prizes-1; j >=1; j--) {
        prizes[j]=prizes[j+1]+ratio;
        }

        for(int k=1;k<=total_prizes;k++){
            System.out.printf("%d) %.2f\n",k,prizes[k]);
            s+=prizes[k];
        }
        System.out.printf("TOTAL SUM: %.2f\n",s);
    }

循环内部:

for (int j = total_prizes-1; j >=1; j--) {
  //ratio here should be calculated dynamically based on position...
    prizes[j]=prizes[j+1]+ratio;
        }

谢谢! :)

1 个答案:

答案 0 :(得分:2)

如果我理解你,你想要的是具备以下条件:

  1. 固定总金额。在这种情况下1000
  2. 大约为r几何比例n。在这种情况下1.75
  3. 所有&#34; round&#34;数字。在这种情况下,到最近的25
  4. 我建议您首先创建一个精确的几何序列来解决它,然后将其调整为圆形数字。

    第一步很简单,因为所有带n项的几何系列都是这样的:

    x + r * x + r^2 * x + ... + r^(n-1) * x
        = x * (1 + r + r^2 + ... + r^(n-1))
        = x * (1 + r + r^2 + ... + r^(n-1)) * (r - 1) / (r - 1)
        = x * ((r - 1) + (r^2 - r) + (r^3 - r^2) + ... + (r^(n) - r^(n-1)) / (r - 1)
        = x * (-1 + (r - r) + (r^2 - r^2) + ... + (r^(n-1) - r^(n-1)) + r^n) / (r - 1)
        = x * (r^n - 1) / (r - 1)
    

    所以我们想要

    1000 = x * (r^n - 1) / (r - 1)
         = x * (1.75^5 - 1) / (1.75 - 1)
         = x * (16.4130859375 - 1) / 0.75
         = 20.55078125 x
    

    这为我们提供了以下起始解决方案。

    48.6599505797377
    85.154913514541
    149.021098650447
    260.786922638282
    456.377114616993
    

    之后,这是一个上下调整这些数字以获得所需答案的问题。有很多方法可以做到这一点。一个是简单地从最小的开始并将其移动到四舍五入的数字,并按照其权重按比例重新分配,并继续。这为您提供了以下部分答案序列。

    48.6599505797377
    85.154913514541
    149.021098650447
    260.786922638282
    456.377114616993
    
    50
    85.034965034965
    148.811188811189
    260.41958041958
    455.734265734266
    
    50
    75
    150.537634408602
    263.440860215054
    461.021505376344
    
    50
    75
    150
    263.636363636364
    461.363636363636
    
    50
    75
    150
    275
    450
    

    这不是完全您想要的答案。但它非常接近并希望作为一种策略可以接受。

    更新我曾尝试1.75因为它接近(475/50)^(1/4)。当我尝试1.8时,我得到了你想要的答案。

    此外请注意,我们不需要生成所有这些中间答案。每次我们只需要最小的术语。由target * (r-1) / (r^n - 1)给出。每次找到最小的项时,从目标中减去该项,将n减1,然后重复。