【问题标题】:How do I get a randomly selected hash key in Perl 6?如何在 Perl 6 中获得随机选择的哈希键?
【发布时间】:2016-01-30 03:20:43
【问题描述】:

一个快速且希望简单的问题:

我需要从一组给定的哈希键中随机选择的方法。关于 randHash 的 perl6.org 文档提供了许多提示。

my %a = 1,2,3,4,5,6;

鉴于上述情况,

%a.keys;

返回(5 1 3),如果我只是尝试

%a.rand;

我得到一个伪随机浮点数而不是任何一个键。

我最终拼凑了%a.keys[Int(%a.elems.rand)],但希望得到更简单的东西。

【问题讨论】:

  • 我最终拼凑起来 %a.keys[Int(%a.elems.rand)] 但我猜是希望更简单。

标签: random hash key raku rakudo


【解决方案1】:

使用pickroll,例如

%a.keys.pick

【讨论】:

  • 关于 pick() 让我感到困惑的事情的一个注释:如果您想从列表中选择多个元素,不重复,请使用您想要的号码调用一次。每次调用它时,它都会从完整列表重新开始,并且可以再次重复元素。换句话说,要从一副牌中抽出 5 张牌,请执行以下操作: my @hand = @deck.pick(5);不是:我的 $card1 = @deck.pick;我的 $card2 = @deck.pick; # 等等
  • 或者:%a.pick.key
【解决方案2】:

一如既往,Christoph's answer 是正确的(他非常了解 Perl 6)。但是,我想我会详细说明一下,因为 pickroll 一开始很容易混淆。


如果你只想要一个随机项,那么pickroll 看起来相同,可以互换使用,因为它们都默认返回原始列表或数组中的一项: p>

my $rand-keyA = %a.keys.pick;

my $rand-keyB = %a.keys.roll;

但是,这样想它们:
pick 的意思是“由于这个容器中只有 N 个东西,我只能挑选到 N 个东西一次。”
roll 表示“我有一个 N 面的骰子,我可以滚动 次想要。”

my %a = 1,2,3,4,5,6;  # { 1 => 2, 3 => 4, 5 => 6 }
                      # (i.e. keys are 1, 3, and 5)

say %a.keys.pick(2);  # (5 3)
say %a.keys.pick(2);  # (3 1)
say %a.keys.pick(5);  # (3 5 1) no more, because there were only three to pick from
say %a.keys.pick(10); # (3 1 5) 

say %a.keys.roll(5);  # (1 5 1 5 3)           as many "rolls" as you request
say %a.keys.roll(10); # (5 5 1 1 5 5 3 1 3 1) 

pick(*) 是一种从数组创建随机重新排序的列表的简单方法,而无需知道它有多少元素:

my @array = <foo bar baz foobar>;

@array.pick(*); # (bar foobar baz foo)

roll(*) 是一种创建无限列表的简单方法,其元素是从原始数组中随机选择的:

my @rolls = @array.roll(*);

say @rolls[0];         # foobar
say @rolls[10];        # bar
say @rolls[351];       # baz
say @rolls[19123];     # foobar
say @rolls[1000000];   # bar
say @rolls[1000001];   # bar
say @rolls[1000002];   # foo

【讨论】:

  • 好东西;我很欣赏你的阐述
猜你喜欢
  • 2021-12-30
  • 2012-10-01
  • 2011-10-04
  • 1970-01-01
  • 2013-02-12
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多