2
Task1, X% 
Task2, Y%
Task3, Z%
----
TaskN, N%

And X + Y + Z + . . .  + N = 100%

问题:-上面的配置文件对不同的任务有某种类型的权重(执行 Task1 X% 的时间并在 Line1 上打印任何内容,执行 Task2 Y% 的时间并在 Line2 上打印任何内容并执行 Task3 Z% 的时间和在 Line3 等上打印任何内容。总重量加起来应为 100%。

我写的代码: -我写了一个程序,我在其中逐行读取文件并将所有行存储在字符串的 ArrayList 中,然后我生成了一些介于 1 和 100 之间的随机数。例如,有三个任务-

Task1 75%
Task2 15%
Task3 10%   

获取 1-100 之间的随机数。如果数字是 1-75 do Task1 意味着在 line1 上打印任何东西,76-90 do Task2 意味着在 Line2 上打印任何东西,91-100 do Task3 意味着在 line3 上打印任何东西。但是我如何为任何具有 N 个任务且具有任何百分比数的配置文件扩展它。我被困在这部分。

                private static Random r = new Random();
                private final static int Low = 1;
                private final static int High = 100;
                String sCurrentLine;
                ArrayList<Integer> percentageCalls = new ArrayList<Integer>();

                br = new BufferedReader(new FileReader("S:\\config.txt"));

                int R = r.nextInt(High-Low) + Low;

                ArrayList<List<String>> allLines = new ArrayList<List<String>>();
                while ((sCurrentLine = br.readLine()) != null) {
                    allLines.add(Arrays.asList(sCurrentLine.split("\\s+")));
                    Collections.shuffle(allLines);
                }

                for (List<String> s1 : allLines) {
                    percentageCalls.add(Integer.parseInt(s1.get(0)));
                }
                Collections.sort(percentageCalls, Collections.reverseOrder());
4

1 回答 1

2

我最近为一个你应该能够适应的项目写了一些东西来做这件事。此类允许将任意数量的选择添加到“可能性”列表中。机会量可以是任何整数...总数不需要加起来为 100。因此,如果您希望选择 A 在 302 次中发生 5 次,而选择 B 在其他 297 次中发生,那么您可以添加 A有 5 的机会,B 有 297 的机会。这段代码有点粗糙,可能需要一些改进,但这个想法应该可以帮助您扩展到 N 个选项。您只需要编写一些循环遍历文件并将每种可能性添加到 ResultGenerator 的内容。

样品用途:

ResultGenerator<String> rgen = new ResultGenerator<String>();

rgen.AddPossibility("Red", 25);
rgen.AddPossibility("Blue", 20);
rgen.AddPossibility("Green", 30);
rgen.AddPossibility("Black", 5);
rgen.AddPossibility("White", 15);

String result = rgen.GetRandomResult();

班级:

public class ResultGenerator<T> {

     class Possibility
     {
         Possibility(T choice, int chance)
         {
             this.Choice = choice;
             this.Chance = chance;
         }

         public T Choice;
         public int Chance;
         public int RangeMax;
         public int RangeMin;

     }

     private Random r;

     public ResultGenerator(Random r)
     {
         this.r = r;
     }

     public ResultGenerator()
     {
         this.r = new Random();
     }

     private List<Possibility> possibilities = new ArrayList<Possibility>();

     public void AddPossibility(T choice, int chance) {
         possibilities.add(new Possibility(choice, chance));
     }

     public T GetRandomResult() {

         if (possibilities.size() == 0)
             return null;

         //Calculate ranges for possibilities
         int totalChances = 0;
         for (Possibility p : possibilities) {
             p.RangeMin = totalChances;
             p.RangeMax = totalChances + p.Chance;
             totalChances += p.Chance;
         }

         int randomNumber = 1 + r.nextInt(totalChances + 1);

         for(Possibility possibility : possibilities)
         {
             if (randomNumber <= possibility.RangeMax && randomNumber > possibility.RangeMin)
             {
                 return possibility.Choice;
             }
         }

         return null;
     }

}
于 2012-05-16T18:10:21.283 回答