如何对以不同频率执行的偶发事件进行编程?

Mar*_*Ath 3 java random

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

例如

Case 1 --> happens always
Case 2 --> happens 20% of times
Case 3 --> happens 60% of times
Run Code Online (Sandbox Code Playgroud)

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

x = nextInt(100);
execute case 1
if( x <= 20 ){
 execute case 2
}
if ( x <= 60 ){
 execute case 3
}
Run Code Online (Sandbox Code Playgroud)

对于这个问题有不同的方法吗?也许有一些我不知道的功能?java random文档似乎没有这方面的内容。

Tro*_*dor 5

您可以使用 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>
Run Code Online (Sandbox Code Playgroud)

也许有点矫枉过正

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
} 
...
Run Code Online (Sandbox Code Playgroud)

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

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;
} 
Run Code Online (Sandbox Code Playgroud)

只执行一种情况,每种情况都有不同的执行概率。它非常灵活。