Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 根据百分比调用不同的任务_Java_Random - Fatal编程技术网

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

Java 根据百分比调用不同的任务,java,random,Java,Random,问题:-上述配置文件对不同的任务进行了某种类型的称重(执行Task1 X%的时间并在第1行打印任何内容,执行Task2 Y%的时间并在第2行打印任何内容,执行Task3 Z%的时间并在第3行打印任何内容等。总称重应达到100% 我编写的代码:-我编写了一个程序,其中我逐行读取文件,并将所有行存储在字符串的ArrayList中,然后我生成了一些介于1和100之间的随机数。例如,有三个任务- Task1, X% Task2, Y% Task3, Z% ---- TaskN, N% And X +

问题:-上述配置文件对不同的任务进行了某种类型的称重(执行Task1 X%的时间并在第1行打印任何内容,执行Task2 Y%的时间并在第2行打印任何内容,执行Task3 Z%的时间并在第3行打印任何内容等。总称重应达到100%

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

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

And X + Y + Z + . . .  + N = 100%
获取一个介于1-100之间的随机数。如果数字为1-75,则do Task1表示在第1行上打印任何内容,76-90 do Task2表示在第2行上打印任何内容,91-100 do Task3表示在第3行上打印任何内容。但是,对于任何包含N个任务且具有任意百分比的配置文件,我如何扩展此项。我一直在这一部分

Task1 75%
Task2 15%
Task3 10%   
private static Random r=new Random();
专用最终静态int低=1;
专用最终静态int高=100;
弦电流线;
ArrayList percentageCalls=新建ArrayList();
br=新的BufferedReader(新的文件读取器(“S:\\config.txt”);
int R=R.nextInt(高-低)+低;
ArrayList allLines=新的ArrayList();
而((sCurrentLine=br.readLine())!=null){
allLines.add(Arrays.asList(sCurrentLine.split(\\s+)));
集合。洗牌(所有行);
}
对于(列表s1:所有行){
percentageCalls.add(Integer.parseInt(s1.get(0));
}
Collections.sort(percentageCalls,Collections.reverseOrder());

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

样本使用:

                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());
ResultGenerator rgen=new ResultGenerator();
rgen.add可能性(“红色”,25);
rgen.add可能性(“蓝色”,20);
rgen.add可能性(“绿色”,30);
rgen.add可能性(“黑色”,5);
rgen.add可能性(“白色”,15);
String result=rgen.GetRandomResult();
类别:

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();
公共类结果生成器{
阶级可能性
{
可能性(T选择,int机会)
{
这个。选择=选择;
这个。机会=机会;
}
公共选择;
公共机会;
公共int RangeMax;
公营机构;;
}
私有随机r;
公共结果生成器(随机r)
{
这个。r=r;
}
公共结果生成器()
{
this.r=新随机数();
}
私有列表可能性=新的ArrayList();
公共无效添加可能性(T选择,int机会){
添加(新的可能性(选择,机会));
}
公共T GetRandomResult(){
if(可能性.size()==0)
返回null;
//计算可能性的范围
整数=0;
for(可能性p:可能性){
p、 RangeMin=总机会;
p、 RangeMax=总机会+p.机会;
总机会+=p.机会;
}
int randomNumber=1+r.nextInt(totalOpportunities+1);
对于(可能性:可能性)
{
if(随机数可能性.RangeMin)
{
返回可能性。选择;
}
}
返回null;
}
}

这是同一个问题(也是最近的问题)作为。我认为问题/解决方案的整个概念是有缺陷的,但看看那里是否有一些回答。我刚刚看到了这个链接,但无法确定如何将其扩展到N个任务。交叉发布:我刚刚知道交叉发布是不允许的,我现在应该怎么做,我应该在这个论坛上发布一个新问题吗?任何问题都将被删除appreciated@Nevzz03:不,我认为交叉发帖是允许的,但为了考虑到所有人,你应该在所有交叉发帖中列出所有交叉发帖的链接。没有人喜欢花很多时间回答一个问题,却发现它是在几个小时前在交叉发帖中得到回答的。请记住,我们都是志愿者,我们自己的时间与你的时间一样宝贵啊,我们就像你的时间对你一样。
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;
     }

}