【问题标题】:Percentage of Random Calls to Different Command in Text File文本文件中不同命令的随机调用百分比
【发布时间】:2012-05-15 19:36:44
【问题描述】:

这是我的配置文件(Test.txt)

CommandA   75%
CommandB   15%
CommandC   10%

我编写了一个多线程程序,我在其中逐行读取文件,但不确定我应该如何解决上述问题,其中这么多百分比(75%)的随机调用转到 CommandA,而这么多百分比(15 %) 的随机调用转到 CommandB,与 CommandC 相同。

public static void main(String[] args) {

            for (int i = 1; i <= threadSize; i++) {
                new Thread(new ThreadTask(i)).start();
            }
        }

class ThreadTask implements Runnable {

        public synchronized void run() {
            BufferedReader br = null;

            try {
                String line;

                br = new BufferedReader(new FileReader("C:\\Test.txt"));

                while ((line = br.readLine()) != null) {
                    String[] s = line.split("\\s+");
                    for (String split : s) {
                    System.out.println(split);
                }
            }

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (br != null)br.close();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }

        }
    }

【问题讨论】:

    标签: java multithreading random


    【解决方案1】:

    获取一个 1-100 的随机数。如果编号为 1-75 执行命令 A,76-90 执行命令 B,91-100 执行命令 C。

    编辑评论:

    有两种方法我会考虑这样做。如果你只有三个命令(A、B、C),那么你可以做一个简单的:

        int[] commandPercentages = {75, 15, 10};        
        int randomNumber = 90;
    
        if((randomNumber -= commandPercentages[0]) < 0) {
            //Execute Command A
        }
        else if((randomNumber -= commandPercentages[1]) < 0) {
            //Execute Command B
        }
        else {
            //Execute Command C
        }
    

    如果你有很多复杂的命令,你可以像这样设置命令:

    private abstract class Command {
        int m_percentage;       
        Command(int percentage) {
            m_percentage = percentage;
        }       
        int getPercentage() {
            return m_percentage;
        }
        abstract void executeCommand();
    };
    
    private class CommandA extends Command {        
        CommandA(int percentage) {
            super(percentage);
        }
        @Override
        public void executeCommand() {
            //Execute Command A
        }       
    }
    
    private class CommandB extends Command {        
        CommandB(int percentage) {
            super(percentage);
        }
        @Override
        public void executeCommand() {
            //Execute Command B
        }
    
    }
    

    然后像这样选择命令:

        Command[] commands = null;  
        int randomNumber = 90;
    
        commands[0] = new CommandA(75);
        commands[1] = new CommandB(25);
    
        for(Command c: commands) {
            randomNumber -= c.getPercentage();
            if(randomNumber < 0) {
                c.executeCommand();
            }
        }
    

    【讨论】:

    • 那么假设如果我生成 1 到 100 之间的随机数。如果数字在 1 到 75 之间,我将执行 CommandA,这意味着它将在 75% 的时间内执行 CommandA?如果数字在 76 到 90 之间,我将执行 CommandB,这意味着它将在 15% 的时间内执行 CommandB?和 CommandC 一样吗?
    • 如何在代码中使其更具可配置性,因为百分比数字将在配置文件中不断变化,因此根据配置文件中的百分比,我怎样才能使其在所有情况下都可配置.但是对于这种情况,我可以对条件进行硬编码,但在一般情况下,我怎样才能使其可配置。任何代码 sn-p 将不胜感激。
    • 我会给你上面建议的算法的更一般的形式。请注意,Pn 是指命令 N 的概率。如果数字是 1 到 Pa 执行命令 A,(Pa + 1) 到 (Pa + Pb) 执行命令 B,(Pa+Pb+1) 到 (Pa + Pb + Pc) 执行命令 C。希望对您有所帮助。您可以将模式扩展到更多命令。
    • 我给出了两种可能的方式来实现这个 Raihan。
    • 谢谢 thagorn,但在我的配置文件中可以有多个命令名称(不限于 3 个),百分比数字也可以更改,所以你给我的例子适用于极端情况吗?跨度>
    猜你喜欢
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 2021-06-22
    • 2021-01-19
    • 2011-12-05
    • 1970-01-01
    相关资源
    最近更新 更多