0
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)

上記は、 StackOverflowからアドバイスを得て、以下に記述したロジックからCommandAを70%、CommandBを30%印刷しているテキストファイルです。今私が欲しいのは、CommandAが70%の時間、次に70 $の時間の80%が印刷されている場合、Previousも印刷し、70%の時間の20%がNewを印刷する必要があるということです。同様に、70%の時間の50%がtrueで、50%の時間がfalseの時間を出力する必要があります。だから基本的に問題はこのようなものです-問題ステートメント


「CommandA」を70%の確率で印刷し、そのうち70%が「前」を80%印刷し、20%が「新規」を印刷します。そして、それらの70%のうち50%が「true」を印刷し、50%が「false」を印刷します。同様に、CommandBの場合は「CommandB」を30%印刷し、それらの30%のうち50%が「Previous」を印刷して50%"を印刷します。新しい"。そして、それらの30%のうち、30%が「真」、70%が「偽」と印刷されます。


したがって、現在、以下のコードでは、CommandAの70%とCommandBの30%を印刷しています。上記の要件のコードをどのように追加すればよいかわかりません。

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

PS実行率のために私が書いたロジックは、stackoverflowで行った投稿からのものです。

4

1 に答える 1

1

このクラスを使用して、java.util.Random乱数を生成できます。このRandom.nextDouble()メソッドは0から1までの値を返すため、これに100を掛けると、パーセンテージが得られます。次に、数値をコマンドの目的のパーセンテージと比較します(例:70の場合CommandA

コマンドに必要なパーセンテージがわかっているので、別の乱数を生成するか、生成したばかりの乱数をコマンドの選択に使用できます。

  1. 新しい数値を生成します:(生成については上記を参照)、次に、パーセンテージを目的の第2レベルの分布(たとえば、80の場合Previous)と比較できます。

  2. 同じ番号を再利用します。コマンド選択しきい値の適切な部分を計算し、その番号と比較します。たとえばCommandA、しきい値は70です。69を生成したとします(これは70未満であるため、CommandA選択されました)。したがって、70 * 80%=56を計算します。New69はそれよりも大きいので、 (の代わりにPrevious)を選択します

:コマンドを選択する現在のロジックを維持している場合でも、アプローチ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メソッドが静的ではないため、オブジェクトを作成しました

于 2012-05-22T01:40:16.187 に答える