Все, что вы говорите, возможно ... есть как минимум 4 способа сделать это: создать агентов с распределением, создать коллекцию классов распространения, выполнить упомянутое вами строковое выражение и прочитать и вычислить непосредственно из базы данных.В этом конкретном случае мне нравится опция с классами, и выражение one будет для вас проще, но я могу записать все остальные опции позже:
Использование 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();