您所说的一切皆有可能.. 至少有 4 种方法可以做到这一点:使用分发创建代理、创建分发类的集合、执行您提到的字符串表达式以及直接从数据库中读取和计算。在这种特殊情况下,我喜欢带有类的选项,并且表达式对您来说更简单,但我稍后可能会写下所有其他选项:
使用 ExecuteExpression
如果您设法使用代表您的分布的字符串创建了一个集合,您可以这样做:
executeExpression("uniform(100,200)");
或者在你的情况下有一个集合(无论你选择“i”是什么)
executeExpression(collection.get(i));
但这很难看,所以我会做复杂而酷的方式
使用数据库
显然,第一件事是使用您的信息创建一个数据库。我会假设,因为这似乎是您的情况,您希望拥有一个统一的分布集合。所以数据库将如下所示:
其中 cum_probability 是要选择的分布的累积概率,最大值和最小值将代表您的均匀(最小,最大)分布的参数。
使用类收集分布
现在我们将创建一个包含所有这些信息的类:
public class Distribution implements Serializable {
public double probability;
public double min;
public double max;
/**
* Default constructor
*/
public Distribution(double probability,double min,double max) {
this.probability=probability;
this.min=min;
this.max=max;
}
public double getDistributionResult() {
return uniform(this.min,this.max,new Random());
}
}
您还将创建一个集合:

您将在 Main 中初始化您的集合 - 启动时
List <Tuple> theList=selectFrom(distributions).list();
for(Tuple t : theList){
distributionsArray.add(
new Distribution(t.get(distributions.cum_probability),
t.get(distributions.minimum),
t.get(distributions.maximum))
);
}
好的,现在你有一个发行版的集合。伟大的。剩下的唯一事情是创建一个返回随机集合分布结果的函数:
double rand=uniform();
List <Distribution> filtered=filter(distributionsArray,d->d.probability>=rand);
return top(filtered,d->-d.probability).getDistributionResult();