我试图找到一种方法来打印一个随机的坐标列表,没有任何重复,给出两个维度的最小值和最大值。
虽然我很难理解' X'和'>>'确实或意味着什么。任何人都可以帮忙解释一下吗?
my $a=3;
my $b=3;
for (^$a X ^$b)>>.Array.pick(*) -> [$a,$b]
{
print "($a, $b)";
}
输出(示例):
(1,1)(0,1)(0,2)(1,2)(0,0)(2,2)(2,1)(1,0)(2,0)
答案 0 :(得分:2)
Documentation on X
。
Documentation on >>
。
虽然在这种情况下你并不需要>>.Array
,正如布拉德已经指出的那样。
假设您永远不会超过可能的坐标排列数,您可能会发现这样做的效果更好(对于低坐标数和排列数):
my $a = 3;
my $b = 3;
my $number = 5; # must be less than $a * $b
for (($a.rand.Int,$b.rand.Int) xx *).unique(:as(*.Str)).head($number) {
.gist.print
}
($a.rand.Int,$b.rand.Int) xx *
创建无限Seq
个随机坐标对。 .unique(:as(*.Str))
确保我们根据.Str
表示过滤掉唯一的坐标。然后.head
只需要找到前5个。
这可以防止必须构建所有排列。再说一遍,如果你确实需要它们,那么你的方式(减去>>.Array
)几乎就是我的方式。
Rakudo Perl 6的未来版本可能不需要:as(*.Str)
,这样可以使其表现更好。