2012-05-22 51 views
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) 

以上就是我的文本文件中,我打印CommandA的70%的時間和CommandB的從我從StackOverflow的及彼諮詢下面寫的邏輯的時間30% 。現在我想要的是,如果CommandA在70%的時間內打印出來,然後是70%的時間的80%,那麼它還應該打印Previous以及打印New時間的70%時間的20%。同樣,它應該打印70%的真實時間中的50%和50%的時間虛假。 所以基本問題是像這 - 問題陳述隨機分配百分比,以每個詞


打印 「CommandA」 的70%的時間,進出的70%印刷80% 「上一頁」 和印刷20%的 「新」 的。同樣,對於CommandB打印「CommandB」的30%的時間,並在這30%打印50%的「上一頁」和打印50%的「真」 和打印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); 
} 

P.S.我爲百分比執行寫的邏輯來自我在stackoverflow上發佈的帖子。

+0

我沒有看到任何隨機性以所列代碼 – Attila

+0

隨機性是存在在哪個命令上的重量被拾取基礎感。或者什麼是從頭開始解決這個問題的最好方法。 – ferhan

回答

1

您可以使用java.util.Random類生成隨機數。 Random.nextDouble()方法返回一個介於0和1之間的值,所以如果你用100乘以100得到一個百分比。然後比較對所需的百分比數的命令(例如70 CommandA

你既然知道這些命令所需的百分比,您可以生成另一個隨機數或只使用該命令的選擇產生的一個。

  1. 生成一個新的號碼:(參見上述用於產生),然後就可以比較所希望的第二電平分佈的百分比(例如80 Previous

  2. 重用相同的數:計算命令選擇閾值的相應部分,並將其與該值進行比較。例如。對於CommandA,閾值爲70.假設您生成了69(這小於70,因此選擇了CommandA)。所以你計算70 * 80%= 56。69比更大,所以你選擇New(而不是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小號getExecutionPercentage()總和(至少)100

更新:由Random對象作爲方法不是靜態

+0

感謝您的解釋。你能否給我一個滿足我上述要求的例子,通過這種方式我可以更多地理解並做出所需的更改。 – ferhan

+0

@RaihanJamal - 查看更新 – Attila

+0

你確定這樣會執行所需的percenatges時間嗎?我仍然不確定。 – ferhan