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%になるはずです。

私が書いたコード:-ファイルを1行ずつ読み取り、すべての行をStringのArrayListに格納するプログラムを作成し、1〜100の乱数を生成しました。たとえば、3つのタスクがあります。 -

Task1 75%
Task2 15%
Task3 10%   

1〜100の乱数を取得します。番号が1-75doTask1はline1に何かを印刷することを意味し、76-90 do Task2はLine2に何かを印刷することを意味し、91-100doTask3は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 に答える