根据百分比调用不同的任务

时间:2012-05-15 23:20:24

标签: java random

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

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

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

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

Task1 75%
Task2 15%
Task3 10%   

获取1-100之间的随机数。如果数字是1-75,那么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());

1 个答案:

答案 0 :(得分:2)

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

样品使用:

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;
     }

}