权衡“选择”程序的“随机性”?

kaw*_*aii 8 rakudo perl6 raku

我正在使用Cro框架在Perl 6中创建一个API服务器!该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
    }
  },
Run Code Online (Sandbox Code Playgroud)

您会注意到我有两个叫default和的键alolan,这是因为Pokemon可以有多种形式,但是与这个问题几乎没有关系-实际的性别比率值是相关的。这是我的生成方法当前的样子:

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

    return GENDER.pick;
}
Run Code Online (Sandbox Code Playgroud)

默认情况下pick是随机的,在这种情况下为50/50。但是,我希望能够根据数据库返回的比率结果加权每个选项的随机性。我的想法之一是将GENDER数据库查询的结果作为枚举的种子,因此对于特定示例,它看起来更像这样:

enum GENDER ( <Male Female Female Female> );
Run Code Online (Sandbox Code Playgroud)

除非其他人对pick基于我的SELECT陈述结果动态更改行为有更好的想法?

jjm*_*elo 10

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

  • 可能`.pick`在`Mix`上不起作用,因为它不应该做什么。我很好奇,如果错误消息“ Mix不支持.pick”能否合理地建议“也许您想要`.roll`?” 也许`Failure`s可以盈利地支持此类提示的提示属性(.hint` ??)? (3认同)
  • 通过https://github.com/rakudo/rakudo/commit/e352962284完成。好吧,这是一个简单的案例,因为它仍然是一个无类型的失败。 (3认同)