我试图找到一种方法来打印一个随机的坐标列表,没有任何重复,给出两个维度的最小值和最大值。
虽然我很难理解'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)
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)
,这将使这个表现更好。