我如何在 Perl 6 中获得随机选择的散列键?
How do I get a randomly selected hash key in Perl 6?
一个快速且简单的问题:
我需要从一组给定的哈希键中随机 select 的方法。关于这两个 rand nor Hash 的 perl6.org 文档提供了很多提示。
my %a = 1,2,3,4,5,6;
鉴于以上情况,
%a.keys;
returns (5 1 3)
如果我只是尝试
%a.rand;
我得到一个伪随机浮点数而不是任何一个键。
我最终拼凑起来 %a.keys[Int(%a.elems.rand)]
,但希望能有更简单的东西。
%a.keys.pick
一如既往, is correct (he knows Perl 6 well). However, I thought I'd elaborate a little since pick
and roll
一开始很容易混淆。
如果您只想要一个随机项目,那么 pick
and roll
看起来 相同并且可以互换使用,因为它们都默认返回原始列表或数组中的一个项目:
my $rand-keyA = %a.keys.pick;
my $rand-keyB = %a.keys.roll;
但是,这样想:
pick
意思是“因为这个容器里只有 N 个东西,所以我最多只能 pick N 事情一次。"
roll
意思是“我有一个 N 面的骰子,我可以 roll 任意多次。”
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
一个快速且简单的问题:
我需要从一组给定的哈希键中随机 select 的方法。关于这两个 rand nor Hash 的 perl6.org 文档提供了很多提示。
my %a = 1,2,3,4,5,6;
鉴于以上情况,
%a.keys;
returns (5 1 3)
如果我只是尝试
%a.rand;
我得到一个伪随机浮点数而不是任何一个键。
我最终拼凑起来 %a.keys[Int(%a.elems.rand)]
,但希望能有更简单的东西。
%a.keys.pick
一如既往,pick
and roll
一开始很容易混淆。
如果您只想要一个随机项目,那么 pick
and roll
看起来 相同并且可以互换使用,因为它们都默认返回原始列表或数组中的一个项目:
my $rand-keyA = %a.keys.pick;
my $rand-keyB = %a.keys.roll;
但是,这样想:
pick
意思是“因为这个容器里只有 N 个东西,所以我最多只能 pick N 事情一次。"
roll
意思是“我有一个 N 面的骰子,我可以 roll 任意多次。”
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