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());
答案 0 :(得分: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;
}
}