随机分配每个单词的百分比

时间:2012-05-22 01:18:19

标签: java random

Percentage:70 - CommandA  Data:Previous/New(80/20)    User:true/false(50/50)
Percentage:30 - CommandB  Data:Previous/New(50/50)    User:true/false(30/70)

上面是我的文本文件,其中我70%的时间打印CommandA,而30%的时间来自我在下面写的逻辑,从StackOverflow获取建议。现在我想要的是,如果CommandA在70%的时间内被打印,那么在70美元时间的80%,它也应该打印上一次和20%的70%的时间它应该打印新的。同样,它应该打印70%的时间中的50%为真,50%的时间为假。 所以基本上问题就像这样 - 问题陈述


  

70%的时间打印“CommandA”,70%打印80%打印   “上一页”并打印20%“新”。而那些70%的印数50%“真实”   并且打印50%“false”同样,对于CommandB打印“CommandB”的30%   时间,并在那些30%打印50%“上一页”和打印50%“新”。   其中30%打印30%“真实”并打印70%“假”


所以目前在我的下面代码中我打印了70%的CommandA和30%的CommandB。我不确定如何添加上述要求的代码。

public static void main(String[] args) {
        commands = new LinkedList<Command>();
        values = new ArrayList<String>();
        br = new BufferedReader(new FileReader("S:\\Testing\\Test2.txt"));
        while ((sCurrentLine = br.readLine()) != null) {
            percentage = sCurrentLine.split("-")[0].split(":")[1].trim();
            values = Arrays.asList(sCurrentLine.split("-")[1].trim().split("\\s+"));
            for(String s : values) {
                if(s.contains("Data:")) {
                // Here data contains **Previous/New(80/20)**
                    data = s.split(":")[1];
                } else if(s.contains("User:")) {
                // Here userLogged contains **true/false(50/50)**
                    userLogged = s.split(":")[1];
                } else {
                    cmdName = s;
                }
            }

            Command command = new Command();
            command.setName(cmdName);
            command.setExecutionPercentage(Double.parseDouble(percentage));
            command.setDataCriteria(data);
            command.setUserLogging(userLogged);
            commands.add(command);
        }

        executedFrequency = new Long[commands.size()];

        for (int i=0; i < commands.size(); i++) {
            executedFrequency[i] = 0L;
        }

        for(int i = 1; i < 10000; i++) {
            Command nextCommand = getNextCommandToExecute();
    // So by my logic each command is being printed specified number of percentage times                    
    System.out.println(nextCommand.getName()); 


/*
 * What I want is that if Command A is executed 70% of time, then according 
 * to properties  file 80% times of 70% of CommandA it should print Previous 
 * and 20% times of 70% of CommandA it should print New Likewise same thing 
 * for User. It should print 50% times of 70% of CommandA true and 50% to false.
 * 
 */

        }
    } 

}

// Get the next command to execute based on percentages
private static Command getNextCommandToExecute() {
    int commandWithMaxNegativeOffset = 0; // To initiate, assume the first one has the max negative offset
    if (totalExecuted != 0) {
        // Manipulate that who has max negative offset from its desired execution
        double executedPercentage = ((double)executedFrequency[commandWithMaxNegativeOffset] / (double)totalExecuted) * 100;
        double offsetOfCommandWithMaxNegative = executedPercentage - commands.get(commandWithMaxNegativeOffset).getExecutionPercentage();

        for (int j=1; j < commands.size(); j++) {
            double executedPercentageOfCurrentCommand = ((double)executedFrequency[j] / (double)totalExecuted) * 100;
            double offsetOfCurrentCommand = executedPercentageOfCurrentCommand - commands.get(j).getExecutionPercentage();

            if (offsetOfCurrentCommand < offsetOfCommandWithMaxNegative) {
                offsetOfCommandWithMaxNegative = offsetOfCurrentCommand;
                commandWithMaxNegativeOffset = j;
            }
        }
    }

    // Next command to execute is the one with max negative offset
    executedFrequency[commandWithMaxNegativeOffset] ++;
    totalExecuted ++;

    return commands.get(commandWithMaxNegativeOffset);
}

P.S。我为执行百分比写的逻辑来自我在stackoverflow上发布的帖子。

1 个答案:

答案 0 :(得分:1)

您可以使用java.util.Random类生成随机数。 Random.nextDouble()方法返回0到1之间的值,因此如果将其乘以100,则得到百分比。然后将该数字与命令所需的百分比进行比较(例如,CommandA为70)

由于您知道命令所需的百分比,因此您可以生成另一个随机数,也可以使用刚生成的随机数来选择命令。

  1. 生成一个新号码 :(参见上面的代数),然后您可以将百分比与所需的二级分布进行比较(例如,Previous为80)

  2. 重复使用相同的数字:计算命令选择阈值的相应部分,并将数字与数字进行比较。例如。对于CommandA,阈值为70.假设您生成了69(小于70,因此选择了CommandA)。所以你计算70 * 80%= 56。 69大于此值,因此您选择New(而不是Previous

  3. 注意:即使你保留了当前选择命令的逻辑,你也可以接近1)

    更新:代码示例:

    Random rnd = new Random();
    double percent = rnd.getNextDouble()*100;
    for (Command c : commands) {
      if (percent < c.getExecutionPercentage()) {
        // we select the current command
        percent = rnd.getNextDouble()*100;
        if (percent < command.getDataCriteria().getPreviousPercentage()) {
          // we select Previous
        } else {
          // we select New
        }
        break;
      } else {
        percent -= c.getExecutionPercentage();
      }
    }
    

    注意:上面的代码假设所有Command s getExecutionPercentage()的总和是(至少)100

    更新:制作Random对象,因为方法不是静态的