Взвесьте «случайность» рутины «выбор»? - PullRequest
8 голосов
/ 18 апреля 2019

Я создаю сервер API в Perl 6, используя платформу Cro!Целью этого API является обслуживание данных о Pokemon и предоставление конечных точек для генерации Pokemon на основе входных данных.Одним из факторов генерации является gender, в моей базе данных PostgreSQL каждая ссылка на Pokemon имеет столбец gender-ratio, который содержит значение JSON, похожее на это:

  "gender-ratio": {
    "default": {
      "Male": 0.25,
      "Female": 0.75
    },
    "alolan": {
      "Male": 0.25,
      "Female": 0.75
    }
  },

Вы заметите, что у меня есть два ключатам называются default и alolan, это потому, что Pokemon может иметь различные формы, но это в основном не имеет отношения к этому вопросу - важны фактические значения соотношения полов.Вот как выглядит мой метод генерации:

method select-gender($pokemon, $form = 'default') {
    enum GENDER ( <Male Female> );

    return GENDER.pick;
}

По умолчанию pick является случайным, в данном случае 50/50.Однако я хотел бы иметь возможность взвешивать случайность каждого варианта, основываясь на результатах отношения, возвращенного из базы данных.Одна из моих идей состояла в том, чтобы заполнить перечисление GENDER результатами запроса к базе данных, чтобы это выглядело более точно для конкретного примера:

enum GENDER ( <Male Female Female Female> );

Если у кого-то еще нет более хороших идей о динамическом измененииповедение pick основано на результате моего оператора SELECT?

1 Ответ

10 голосов
/ 18 апреля 2019

Используйте Mix и roll:

my %gender-ratio =  %(default => {
                             "Male" => 0.25,
                             "Female" => 0.75
                         },
                      alolan => {
                             "Male" => 0.25,
                             "Female" =>  0.75
                         }
                     );

my Mix $default = %gender-ratio<default>.Mix;

for ^10 {
    say $default.roll;
}
...