如何编制以不同频率执行的contigencies?

时间:2016-05-04 09:48:59

标签: java random

说我有3个案例我希望它们被执行,但并非总是如此。

E.g。

Case 1 --> happens always
Case 2 --> happens 20% of times
Case 3 --> happens 60% of times

我该如何编程呢?这是我到目前为止的想法:

x = nextInt(100);
execute case 1
if( x <= 20 ){
 execute case 2
}
if ( x <= 60 ){
 execute case 3
}

这个问题有不同的方法吗?也许有些我不知道的功能? java随机文档似乎没有这方面的东西。

1 个答案:

答案 0 :(得分:4)

您可以使用apache的库数学。

https://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math3/distribution/EnumeratedDistribution.html

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-math3</artifactId>
    <version>3.6.1</version>
</dependency>

可能有点矫枉过正

List<Pair<Boolean,Double>> list = new ArrayList<Pair<Boolean,Double>>();
list.add(new ImmutablePair(true, 0.2));
list.add(new ImmutablePair(false, 0.8));

EnumeratedDistribution e = new EnumeratedDistribution(list);   

//execute case 1

if (e.sample()) {
  //execute case 2
} 
...

但如果你的逻辑改变,你可以这样:

List<Pair<String,Double>> list = new ArrayList<Pair<String,Double>>();
list.add(new ImmutablePair("name_1", 0.2));
list.add(new ImmutablePair("name_2", 0.4));
list.add(new ImmutablePair("name_3", 0.4));
EnumeratedDistribution e = new EnumeratedDistribution(list);    

switch(e.sample()) {
  case "name_1" :
    ...
  break;
  case "name_2" :
    ...
  break;
  case "name_3" :
    ...
  break;
} 

只执行一个案例,每个案例的执行概率不同。它非常灵活。