Coding pattern for random percentage branching?

前端 未结 7 905
再見小時候
再見小時候 2020-12-08 18:26

So let\'s say we have a code block that we want to execute 70% of times and another one 30% of times.

if(Math.random() < 0.7)
    70percentmethod();
else
         


        
相关标签:
7条回答
  • 2020-12-08 19:10

    I'd do that something like this:

    class RandomMethod {
        private final Runnable method;
        private final int probability;
    
        RandomMethod(Runnable method, int probability){
            this.method = method;
            this.probability = probability;
        }
    
        public int getProbability() { return probability; }
        public void run()      { method.run(); }
    }
    
    class MethodChooser {
        private final List<RandomMethod> methods;
        private final int total;
    
        MethodChooser(final List<RandomMethod> methods) {
            this.methods = methods;
            this.total = methods.stream().collect(
                Collectors.summingInt(RandomMethod::getProbability)
            );
        }
    
        public void chooseMethod() {
            final Random random = new Random();
            final int choice = random.nextInt(total);
    
            int count = 0;
            for (final RandomMethod method : methods)
            {
                count += method.getProbability();
                if (choice < count) {
                    method.run();
                    return;
                }
            }
        }
    }
    

    Sample usage:

    MethodChooser chooser = new MethodChooser(Arrays.asList(
        new RandomMethod(Blah::aaa, 1),
        new RandomMethod(Blah::bbb, 3),
        new RandomMethod(Blah::ccc, 1)
    ));
    
    IntStream.range(0, 100).forEach(
        i -> chooser.chooseMethod()
    );
    

    Run it here.

    0 讨论(0)
提交回复
热议问题