【问题标题】:get dynamic ration for distrubution prize java获取分配奖的动态比例java
【发布时间】:2018-06-13 10:18:47
【问题描述】:

我有这个可行的算法,但我想将其更改为具有动态比率,以便使第一个位置的值的距离高于最后一个位置的值。

例如,如果奖金 = 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;
        }

谢谢! :)

【问题讨论】:

    标签: java algorithm math statistics game-engine


    【解决方案1】:

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

    1. 固定总和。在这种情况下1000
    2. 大约是rn 项的几何比。在这种情况下1.75
    3. 所有“整数”数字。在这种情况下到最近的25

    我建议您首先创建一个精确的几何序列,然后将其调整为整数。

    第一步很简单,因为所有带有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 时,我得到了您想要的确切答案。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2013-03-03
      • 2022-10-14
      • 1970-01-01
      • 2013-09-05
      • 2017-01-17
      • 1970-01-01
      相关资源
      最近更新 更多