Оцените «случайность» процедуры «выбора»?

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

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

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

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 оператора?


person kawaii    schedule 18.04.2019    source источник
comment
Я не знал, что разрешено, чтобы одни и те же значения появлялись в перечислении более одного раза.   -  person John    schedule 18.04.2019


Ответы (1)


Используйте 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;
}
person jjmerelo    schedule 18.04.2019
comment
Предположительно .pick не работает с Mix, потому что неясно, что он должен делать. Мне любопытно, может ли сообщение об ошибке - .pick не поддерживается в Mix - разумно предположить, что вы хотите .roll? Возможно, Failures мог бы с пользой поддерживать атрибут подсказки (.hint?) Для таких подсказок? - person raiph; 18.04.2019
comment
Готово с github.com/rakudo/rakudo/commit/e352962284. Что ж, простой случай, поскольку это все еще нетипизированный отказ. - person Elizabeth Mattijsen; 18.04.2019